2017-08-22 50 views
0

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

我的蜘蛛很简单:

# -*- 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:我使用Tor来更改IP每x秒。

+0

新的每个请求的cookie是一样的不使用cookies。 – eLRuLL

+0

@eLRuLL你确定吗?我们如何验证这一点?知道当COOKIES_ENABLED为False时,COOKIES_DEBUG不起作用。 – Hebmaster

回答

0

已解决!

我用的是如下因素代码:

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

规则我打电话通过process_request(感谢托马什)newsession的功能:

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

这应该与使用'COOKIES_ENABLED = False'相同,因为您并未在请求之间合并Cookie,这意味着您不会将存储的Cookie“发送”到下一个请求,而只是接收它们。 'COOKIES_ENABLED = False'甚至应该比这种方法更好,因为你正在使用一个随机数字,它仍然可以创建重复的cookiejars,这意味着将存储的cookie发送回服务器。 – eLRuLL

2

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

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

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

+0

我不知道要放置的cookie的值。它是生成它的服务器(例如会话的ID)。我如何告诉Scrapy向服务器请求新的cookie? – Hebmaster

+0

然后,您可能必须从每个响应的标题中提取它们。 –