Python icrawlerのフィルタなどについて

icrawlerのフィルタあれこれ

参考

icrawlerの初歩

icrawlerというクローラのフレームワークがある。 基本的には、次のような感じでクロールできる。

from icrawler.builtin import BingImageCrawler
if __name__ == "__main__":
    bing_crawler = BingImageCrawler(storage={
        'root_dir': './imgs'
    })
    bing_crawler.crawl(keyword='python')

feeder、parser, downloaderの3つのコンポーネントのうち、 パースすべきURLをparserに与える役割のfeederを拡張したい。と当初は考えた。

builtinで用意されているフィルタを利用するなら、

filters = {
    'size': 'extralarge'
}
bing_crawler.crawl(keyword='python', filters=filters)

のように辞書で渡せば良い。これにより、feederがフィルタを適用したURLを生成してくれる。

しかし、フィルタをURLでなく、cookieで指定していることもあるので、その場合の対処を考える。

cookieを添える

ドキュメントをよく見ると、cookieが必要になるのは、parserであることがわかる。 parserが生成されたURLにアクセスし、パースを行って、画像などのURLを抽出している。

このアクセス時にcookieを指定しておけばOKだ。問題は指定の仕方。

ソースを眺めてみると、parser内でのHTTPリクエストは、requestsライブラリのSessionを継承したクラスのインスタンスを使用している。 これはcrawler生成時に一緒に生成される。(headers=Noneで)

また、crawlerにset_session()メソッドがある。しかし、ソースを読む限り、crawler生成後にこれでセットしても、 parser内のsessionは変わらない。どうやら、自分で継承した時の__init__内で使う用途のメソッドのようだ。

そこで、requestsのドキュメントでsessionやcookieで調べると、Sessionクラスは内部で、cookies: RequestsCookieJarを持っていて、これは辞書のようにcookieを追加できる変数だとわかった。

bing_crawler.parser.session.cookies['cookie_key'] = 'cookie_value'

をクロール前に追加すれば良い。

BingのRestrictなどはこの辺をいじらないといけない。

こちらもどうぞ

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

posted with amazlet at 18.07.18

加藤 耕太
技術評論社
売り上げランキング: 6,312

Amazon.co.jpで詳細を見る

Pythonによるクローラー&スクレイピング入門 設計・開発から収集データの解析・運用まで

Pythonによるクローラー&スクレイピング入門 設計・開発から収集データの解析・運用まで

posted with amazlet at 18.07.18

加藤 勝也 横山 裕季
翔泳社
売り上げランキング: 123,843

Amazon.co.jpで詳細を見る