Python icrawlerのフィルタなどについて
icrawlerのフィルタあれこれ
参考
- Welcome to icrawler — icrawler 0.6.2 documentation
- Developer Interface — Requests 2.19.1 documentation
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クローリング&スクレイピング -データ収集・解析のための実践開発ガイド-
posted with amazlet at 18.07.18
加藤 耕太
技術評論社
売り上げランキング: 6,312
Pythonによるクローラー&スクレイピング入門 設計・開発から収集データの解析・運用まで
posted with amazlet at 18.07.18
加藤 勝也 横山 裕季
翔泳社
売り上げランキング: 123,843

