Blog der Heimetli Software AG

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.

tmmbot petalbot obot robot ahrefsbot googlebot bingbot semrushbot bots yandexbot mj12bot adsbot seznambot blexbot dotbot applebot robots cbot tigerbot zoominfobot dataforseobot coccocbot aspiegelbot siteauditbot 0 50000 100000 150000 200000 250000

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.

BotZugriffe
tmmbot245819
petalbot144833
obot141401
robot132007
ahrefsbot103978
googlebot56146
bingbot45117
semrushbot27522
bots19009
yandexbot13607
mj12bot12320
adsbot11433
seznambot9149
blexbot8712
dotbot6621
applebot6595
robots4703
cbot4401
tigerbot4313
zoominfobot4216
dataforseobot4062
coccocbot3067
aspiegelbot3048
siteauditbot2301
serpstatbot1896
ccbot1330
seekportbot1184
orbbot1134
mauibot937
smtbot771
wiederfreibot587
neevabot517
domainstatsbot476
twitterbot413
facebot388
jobboersebot364
jooblebot364
duckduckbot359
wellknownbot352
surdotlybot343
amazonbot318
awariobot317
mtrobot312
infotigerbot256
yacybot184
indeedbot170
msnbot107
webprosbot100
kazbtbot98
zbot90
cliqzbot82
mojeekbot80
alphaseobot79
alphabot79
clarabot62
linkdexbot43
gpcsupbot40
pinterestbot36
borneobot32
urlsumabot30
bananabot28
linkedinbot28
pooplebot28
websusebot26
linkpadbot26
vebidoobot26
discordbot23
cocolyzebot22
birdcrawlerbot14
roboter12
facebookbot11
iabot11
bitsightbot10
phantombot10
awariorssbot10
jaddjabot10
linkbot9
zoombot9
telegrambot9
searchbot8
komodiabot7
youbot7
archivebot6
rogerbot6
startmebot5
niuebot5
blogbeatbot5
whizebot5
botinfo5
safednsbot5
netpeakcheckerbot4
seobilitybot4
internetarchivebot4
alexandriaorgbot4
gigabot4
whatstuffwherebot4
semanticscholarbot3
keybot3
yandexaccessibilitybot3
vuhuvbot2
zaldomosearchbot2
webtechbot2
bsbot2
webbot2
triplecheckerrobot2
semanticbot2
t3versionsbot2
slackbot2
sitecheckerbotcrawler2
robotstxtparser1
scraperbot1
gaisbot1
redirectbot1
terrawizbot1
statvoobot1
zaldamosearchbot1
domcopbot1
exabot1

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()