【发布时间】:2012-08-24 19:18:02
【问题描述】:
我正在抓取的网站有 javascript,它设置一个 cookie 并在后端检查它以确保 js 已启用。从 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 手动添加到每个请求中?
一个不太理想的选择是通过scrapy配置文件以某种方式设置cookie(值似乎永远不会改变)。这可能吗?
【问题讨论】:
-
Scrapy 默认传递所有 cookie:doc.scrapy.org/en/latest/…
-
这是服务器设置的cookies。据我所知,无法从客户端添加永久 cookie(scrapy)。必须为每个请求单独完成