Scrapyを使っていて、Spiderのコンストラクタ内からユーザエージェントを動的に変えたいケースがあったのでやってみました。
実装はかなり簡単だったのですが、ほしい情報にうまくたどり着けなかった(結局公式に書いてあった)ので、同じ悩みを持つ人のために書いておきます。
バージョン情報
Scrapy 2.1.0
やること
Spiderのコンストラクタ内でself.user_agent
にユーザエージェント文字列を設定します。
こうすることで、デフォルトで動くUserAgentMiddlewareがSpiderの属性からユーザエージェントを拾って使ってくれます。
class CustomCrawlSpider(CrawlSpider):
name = 'crawl'
def __init__(self, *args, **kwargs):
self.user_agent = 'custom-user-agent'
原典
言われなきゃわからん!!と思いましたが、よくよく公式ドキュメントを読んでみるとUserAgentMiddlewareに書かれていました。
In order for a spider to override the default user agent, its user_agent attribute must be set.
GitHubで該当の箇所を見てみるとたしかにspider.user_agent
を参照してます。
その他の設定方法
Scrapyはコマンドラインで与えた引数がSpiderの属性になるので、引数としてuser_agent
を渡すことでもユーザエージェントを指定可能です。
scrapy crawl quotes -a user_agent=custom-user-agent
ユーザエージェントが固定値で良いのであれば、settings.pyやSpiderのcustom_settingsにUSER_AGENT
を設定することでも対応できます。
参考文献