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
コメント