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などはこの辺をいじらないといけない。
こちらもどうぞ
技術評論社
売り上げランキング: 6,312
翔泳社
売り上げランキング: 123,843




コメント