Aco*_*orn 51 python cookies session session-cookies scrapy
关于cookies如何与Scrapy一起工作,以及如何管理这些cookie,我有点困惑.
这基本上是我正在尝试做的简化版本:

当您访问该网站时,您将获得一个会话cookie.
当您进行搜索时,网站会记住您搜索的内容,因此当您执行类似于进入下一页结果的操作时,它会知道它正在处理的搜索.
我的蜘蛛有一个searchpage_url的起始网址
请求parse()搜索页面,并将搜索表单响应传递给search_generator()
search_generator()那么yield很多搜索请求使用FormRequest和搜索表单响应.
每个FormRequests和后续子请求都需要拥有自己的会话,因此需要拥有自己的cookiejar和自己的会话cookie.
我已经看到了文档的一部分,它讨论了一个阻止cookie被合并的元选项.这究竟意味着什么?是否意味着提出请求的蜘蛛将在其余生中拥有自己的cookiejar?
如果cookie是按蜘蛛级别进行的,那么当生成多个蜘蛛时它是如何工作的?是否有可能只使第一个请求生成器产生新的蜘蛛,并确保从那时起只有该蜘蛛处理未来的请求?
我假设我必须禁用多个并发请求..否则一个蜘蛛会在同一会话cookie下进行多次搜索,未来的请求只会涉及最近的搜索?
我很困惑,任何澄清都会受到极大的欢迎!
我刚才想到的另一个选择是完全手动管理会话cookie,并将其从一个请求传递到另一个请求.
我想这意味着禁用cookie ..然后从搜索响应中获取会话cookie,并将其传递给每个后续请求.
这是你在这种情况下应该做的吗?
Noa*_*h_S 40
三年后,我认为这正是您所寻找的:http://doc.scrapy.org/en/latest/topics/downloader-middleware.html#std : reqmeta-cookiejar
只需在spider的start_requests方法中使用类似的东西:
for i, url in enumerate(urls):
yield scrapy.Request("http://www.example.com", meta={'cookiejar': i},
callback=self.parse_page)
Run Code Online (Sandbox Code Playgroud)
请记住,对于后续请求,您需要每次都明确重新附加cookiejar:
def parse_page(self, response):
# do some processing
return scrapy.Request("http://www.example.com/otherpage",
meta={'cookiejar': response.meta['cookiejar']},
callback=self.parse_other_page)
Run Code Online (Sandbox Code Playgroud)
from scrapy.http.cookies import CookieJar
...
class Spider(BaseSpider):
def parse(self, response):
'''Parse category page, extract subcategories links.'''
hxs = HtmlXPathSelector(response)
subcategories = hxs.select(".../@href")
for subcategorySearchLink in subcategories:
subcategorySearchLink = urlparse.urljoin(response.url, subcategorySearchLink)
self.log('Found subcategory link: ' + subcategorySearchLink), log.DEBUG)
yield Request(subcategorySearchLink, callback = self.extractItemLinks,
meta = {'dont_merge_cookies': True})
'''Use dont_merge_cookies to force site generate new PHPSESSID cookie.
This is needed because the site uses sessions to remember the search parameters.'''
def extractItemLinks(self, response):
'''Extract item links from subcategory page and go to next page.'''
hxs = HtmlXPathSelector(response)
for itemLink in hxs.select(".../a/@href"):
itemLink = urlparse.urljoin(response.url, itemLink)
print 'Requesting item page %s' % itemLink
yield Request(...)
nextPageLink = self.getFirst(".../@href", hxs)
if nextPageLink:
nextPageLink = urlparse.urljoin(response.url, nextPageLink)
self.log('\nGoing to next search page: ' + nextPageLink + '\n', log.DEBUG)
cookieJar = response.meta.setdefault('cookie_jar', CookieJar())
cookieJar.extract_cookies(response, response.request)
request = Request(nextPageLink, callback = self.extractItemLinks,
meta = {'dont_merge_cookies': True, 'cookie_jar': cookieJar})
cookieJar.add_cookie_header(request) # apply Set-Cookie ourselves
yield request
else:
self.log('Whole subcategory scraped.', log.DEBUG)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37130 次 |
| 最近记录: |