Seitenabrufe durch Bots auf www.heimetli.ch
Man würde denken dass GoogleBot und BingBot die meisten Dokumente auf der Webseite abrufen, aber weit gefehlt: TMMBot macht fast fünfmal mehr Requests als der GoogleBot.
Was dieser Bot auf der Site sucht ist nicht zu erkennen. Er liest nur die HTML-Files, PDFs oder Bilder scheinen ihn nicht zu interessieren. Auch Google weiss nicht viel über ihn, ausser einer Site mit dem Namen tmmbot.com ist nichts zu finden.
petalbot gehört zu einer Suchmaschine und es gibt öffentliche Informationen dazu. Warum er so viel häufiger als GoogleBot die Site lesen muss ist nicht zu erkären.
obots und robots sind nicht eindeutig, und vermutlich zählen diese Suchbegriffe auch andere Bots mit.
Das Diagramm zeigt nur die Bots mit den meisten Zugriffen, weil die anderen nicht mehr vernünftig dargestellt werden können. In der folgenden Tabelle sind alle Bots aufgeführt.
Vollständige Liste der Bots
Genauer: vollständige Liste der Bots die mindestens eine Seite erfolgreich abgerufen haben. Manche Bots wie der GitCrawlerBot und der DNSResearchBot haben nur Fehler produziert und fehlen deshalb in der Liste.
Bot | Zugriffe |
---|---|
tmmbot | 245819 |
petalbot | 144833 |
obot | 141401 |
robot | 132007 |
ahrefsbot | 103978 |
googlebot | 56146 |
bingbot | 45117 |
semrushbot | 27522 |
bots | 19009 |
yandexbot | 13607 |
mj12bot | 12320 |
adsbot | 11433 |
seznambot | 9149 |
blexbot | 8712 |
dotbot | 6621 |
applebot | 6595 |
robots | 4703 |
cbot | 4401 |
tigerbot | 4313 |
zoominfobot | 4216 |
dataforseobot | 4062 |
coccocbot | 3067 |
aspiegelbot | 3048 |
siteauditbot | 2301 |
serpstatbot | 1896 |
ccbot | 1330 |
seekportbot | 1184 |
orbbot | 1134 |
mauibot | 937 |
smtbot | 771 |
wiederfreibot | 587 |
neevabot | 517 |
domainstatsbot | 476 |
twitterbot | 413 |
facebot | 388 |
jobboersebot | 364 |
jooblebot | 364 |
duckduckbot | 359 |
wellknownbot | 352 |
surdotlybot | 343 |
amazonbot | 318 |
awariobot | 317 |
mtrobot | 312 |
infotigerbot | 256 |
yacybot | 184 |
indeedbot | 170 |
msnbot | 107 |
webprosbot | 100 |
kazbtbot | 98 |
zbot | 90 |
cliqzbot | 82 |
mojeekbot | 80 |
alphaseobot | 79 |
alphabot | 79 |
clarabot | 62 |
linkdexbot | 43 |
gpcsupbot | 40 |
pinterestbot | 36 |
borneobot | 32 |
urlsumabot | 30 |
bananabot | 28 |
linkedinbot | 28 |
pooplebot | 28 |
websusebot | 26 |
linkpadbot | 26 |
vebidoobot | 26 |
discordbot | 23 |
cocolyzebot | 22 |
birdcrawlerbot | 14 |
roboter | 12 |
facebookbot | 11 |
iabot | 11 |
bitsightbot | 10 |
phantombot | 10 |
awariorssbot | 10 |
jaddjabot | 10 |
linkbot | 9 |
zoombot | 9 |
telegrambot | 9 |
searchbot | 8 |
komodiabot | 7 |
youbot | 7 |
archivebot | 6 |
rogerbot | 6 |
startmebot | 5 |
niuebot | 5 |
blogbeatbot | 5 |
whizebot | 5 |
botinfo | 5 |
safednsbot | 5 |
netpeakcheckerbot | 4 |
seobilitybot | 4 |
internetarchivebot | 4 |
alexandriaorgbot | 4 |
gigabot | 4 |
whatstuffwherebot | 4 |
semanticscholarbot | 3 |
keybot | 3 |
yandexaccessibilitybot | 3 |
vuhuvbot | 2 |
zaldomosearchbot | 2 |
webtechbot | 2 |
bsbot | 2 |
webbot | 2 |
triplecheckerrobot | 2 |
semanticbot | 2 |
t3versionsbot | 2 |
slackbot | 2 |
sitecheckerbotcrawler | 2 |
robotstxtparser | 1 |
scraperbot | 1 |
gaisbot | 1 |
redirectbot | 1 |
terrawizbot | 1 |
statvoobot | 1 |
zaldamosearchbot | 1 |
domcopbot | 1 |
exabot | 1 |
Selbstverständlich sind hier nur die Bots aufgeführt die sich auch als Bot zu erkennen geben. Es ist bekannt dass Google die Seiten auch "anonym" abruft. Dies um zu prüfen ob alle User die gleichen Seiten bekommen.
www.heimetli.ch umfasst etwa 100 Seiten. Bots die weniger als hundert Zugriffe haben kennen also nur einzelne Seiten.
Das Script für die Auswertung
import pandas as pd ZEROPOS = 95 BARWIDTH = 800 LINEHEIGHT = 16 def draw_bar( i, row ): base = i * LINEHEIGHT + 20 print( f"<text x=\"{ZEROPOS-5}\" y=\"{base}\" text-anchor=\"end\">{row['pattern']}</text>" ) print( f"<rect x=\"{ZEROPOS}\" y=\"{base-10}\" width=\"{row['count']/250000*BARWIDTH}\" height=\"10\" fill=\"#1f77b4\" stroke=\"#1f77b4\"/>" ) return base def draw_axis( x, y, div ): print( f"<line x1=\"{x}\" y1=\"{y}\" x2=\"{x+5*div+24}\" y2=\"{y}\" stroke=\"black\"/>" ) for i in range(6): print( f"<line x1=\"{x+i*div}\" y1=\"{y}\" x2=\"{x+i*div}\" y2=\"{y+5}\" stroke=\"black\"/>" ) print( f"<text x=\"{x+i*div}\" y=\"{y+22}\" text-anchor=\"middle\">{i*50000}</text>" ) def plot( df ): df.reset_index( inplace=True ) print( "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 922 485\">" ) for index, row in df.iterrows(): base = draw_bar( index, row ) draw_axis( ZEROPOS, base+5, BARWIDTH/5 ) print( "</svg>" ) def count_patterns( df, filename ): result = pd.DataFrame( columns=["pattern","count"] ) with open(filename) as patterns: for pattern in patterns: pattern = pattern.strip() count = df["agent"].str.contains(pattern.strip(),case=False,na=False).sum() result.loc[len(result)] = { "pattern":pattern, "count":count } return result def bot_statistics(): # Read the log file and name the columns df = pd.read_csv( "access.log", header=None, sep=" ", quotechar="\"", escapechar="\\" ) df.columns = ["address","id","user","datetime","offset","request","status","size","referer","agent"] # Delete failed requests df = df[df["status"] < 400] # Count the requests from robots result = count_patterns( df, "bots.txt" ) # Prepare the analysis result.sort_values( "count", ascending=False, inplace=True ) # Save the results result.to_csv( "bots.csv", index=False ) # Plot the top bots plot( result[result["count"] > 2000] ) if __name__ == "__main__": bot_statistics()