在Scrapy中重置cookie而不禁用它们

时间:2017-08-22 08:37:48

标签: cookies scrapy web-crawler

我使用CrawlSpider抓取网站。该网站使用cookie检测我的蜘蛛。如果我禁用它们,它也会检测到我是机器人。那么如何在每个请求中使用新的cookie。

我的蜘蛛很简单:

# -*- coding: utf-8 -*-
import scrapy
import requests
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor



class ExampleSpider(CrawlSpider):
    name = 'example'
    allowed_domains = ['www.example.com']
    start_urls = ['http://www.example.com/items']
    rules = (
        Rule(LinkExtractor(allow=('/items/.'),deny=('sendMessage')), follow=True),
        Rule(LinkExtractor(allow=('/item/[a-z\+]+\-[0-9]+') ,deny=('sendMessage')), callback='parse_item', follow=False),
    )

    def parse_item(self, response):
        #parsing the page et yielding data

PS:我每隔x秒使用tor来改变ip。

2 个答案:

答案 0 :(得分:2)

您可以通过cookies参数为每个Request设置Cookie。使用CrawlSpider类时,它会有点复杂,因为它会根据规则为您生成请求。但是,您可以将process_request参数添加到Rule。来自文档:

  

process_request是一个可调用的或一个字符串(在这种情况下,将使用来自具有该名称的蜘蛛对象的方法),它将被此规则提取的每个请求调用,并且必须返回请求或无(过滤掉请求)。

因此,实现该方法并将cookies参数添加到传入的每个请求中,然后返回修改后的请求。

答案 1 :(得分:0)

已解决!

我使用下面的代码:

def newsession(self, request):
    session_id = random.randint(0,900000)
    tagged = request
    tagged.meta.update(cookiejar=session_id)
    return tagged

规则中,我通过 process_request 调用newsession函数(感谢Tomáš):

        Rule(LinkExtractor(allow=('/item/[a-z\+]+\-[0-9]+') ,deny=('sendMessage')), process_request='newsession', callback='parse_item', follow=False),