私がスクレイピングしている Web サイトには、Cookie を設定し、それをバックエンドでチェックして js が有効になっていることを確認する JavaScript があります。HTMLコードからCookieを抽出するのは簡単ですが、それを設定するのはscrapyの問題のようです. だから私のコードは次のとおりです。
from scrapy.contrib.spiders.init import InitSpider
class TestSpider(InitSpider):
...
rules = (Rule(SgmlLinkExtractor(allow=('products/./index\.html', )), callback='parse_page'),)
def init_request(self):
return Request(url = self.init_url, callback=self.parse_js)
def parse_js(self, response):
match = re.search('setCookie\(\'(.+?)\',\s*?\'(.+?)\',', response.body, re.M)
if match:
cookie = match.group(1)
value = match.group(2)
else:
raise BaseException("Did not find the cookie", response.body)
return Request(url=self.test_page, callback=self.check_test_page, cookies={cookie:value})
def check_test_page(self, response):
if 'Welcome' in response.body:
self.initialized()
def parse_page(self, response):
scraping....
コンテンツが で利用可能であることを確認できますcheck_test_page
。Cookie は完全に機能します。しかしparse_page
、適切な Cookie を持たない CrawlSpider ではリンクが表示されないため、到達することさえありません。スクレイピングセッション中に Cookie を設定する方法はありますか? または、BaseSpider を使用して、手動ですべてのリクエストに Cookie を追加する必要がありますか?
あまり望ましくない代替手段は、何らかの方法でスクレイピー構成ファイルを介して Cookie を設定することです (値は決して変わらないようです)。それは可能ですか?