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

feederparser, 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で)

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

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

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

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

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


こちらもどうぞ


コメント

タイトルとURLをコピーしました