2019年2月23日土曜日

Pythonでrobots.txtとrobotsメタタグを確認する

クローラーやボットがウェブサイトの特定ページをクロールしないように指示する規約があってRobots Exclusion Protocolと呼ばれている。ウェブサイトのルートディレクトリにrobots.txtというファイルを配置して、指示内容をそのファイルに記述する。ウェブサイトではこのrobots.txtを配置することは必須ではないし、クローラー側からしたら拘束力があるわけではないが、スクレイピングするときにはrobots.txtに従っておいた方が無難だと思うので、Pythonでrobots.txtを確認してみる。さらに、robots.txtと同様の目的で使われるrobotsメタタグを確認する方法もまとめておく。


環境


Windows10のWSL(Ubuntu 18.04)。



robots.txtの仕様


ウェブサイトのルートディレクトリ置かれるrobots.txtはテキストファイルで、クローラーのアクセスを禁止するディレクトリなどを指定する。記述方法などの仕様については以下のサイトを参照。



Pythonによるrobots.txtの確認



Pythonでは標準モジュールにrobots.txtをパースするためのパーサーurllib.robotparserが用意されている。これを使って本ブログサイトのrobots.txtの内容を取得して、Crawl-delay(サイトが指定したクロール間隔)の取得と、本ブログのトップページPythonでWikipediaの記念日一覧をGoogleカレンダーに登録するのクローリングが許可されているか確認してみる。

from urllib.robotparser import RobotFileParser

def main():
    root_url = 'https://irukanobox.blogspot.com/'
    rp = RobotFileParser()

    # robots.txtのurlを設定
    rp.set_url(root_url + 'robots.txt')

    rp.read()

    # Crawl-delayの取得
    print('Crawl-delay: ', rp.crawl_delay('*'))

    # クローリング許可があるか確認
    urls = [root_url, root_url + '2019/02/pythonwikipediagoogle.html']
    for url in urls:
        if rp.can_fetch('*', url):
            print('Crawling {} is allowed.'.format(url))

if __name__ == '__main__':
    main()

結果は以下の通り。Crawl-delayは指定されておらず、クローリングは許可されている。



robotメタタグの仕様


robots.txtと似た目的で使われるものにrobotsメタタグがあって、ウェブサイトページのheadセクションに記述される。仕様は以下のサイトを参照。




Pythonによるrobotメタタグの確認


robotメタタグを確認するにはHTMLを解析する。ここではBeautifulSoup4を使う。BeautifulSoup4がインストールされていなければ以下のようにpipでインストールできる。


このブログサイトとYahoo! Japanのrobotsメタタグを確認してみる。

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
from bs4 import BeautifulSoup

def get_robots_meta():
    request_urls = ['https://irukanobox.blogspot.com/', 'https://www.yahoo.co.jp/']

    for url in request_urls:
        req = Request(url)

    try:
        with urlopen(req) as res:
            res_html = res.read().decode('utf8')

        parsed = BeautifulSoup(res_html, 'html.parser')
        robots = parsed.find('meta', attrs={'name': 'robots'})

        print(url)
        if robots:
            print(' Robots meta tag: ', robots['content'])
        else:
            print(' No robots meta tag.')
    except HTTPError as e:
        print('HTTPError: {}'.format(e.reason))
    except URLError as e:
        print('URLError: {}'.format(e.reason))

if __name__ == '__main__':
    get_robots_meta()

結果は以下の通り。


本ブログサイトにはrobotsメタタグは設定されていないし、Yahoo Japan!にはnoodpというメタタグが設定されている。noodpについてはMETAタグ活用完全ガイド noindex nofollow noarchive unavailable_after など使い方まとめに以下のような説明がある。Yahooなどの検索結果のリンク下に表示される説明文があるが、その説明文にDMOZが使用されることを拒否する指示をするために使われるらしい。

noodp は、生ける屍のような状態のディレクトリサイト・DMOZ (Open Directory Project)に掲載されている説明文をスニペットとしてウェブ検索結果に利用されるのを拒否するための指示です。Google と Bing 共にサポートしています。


0 件のコメント:

コメントを投稿