2017-08-22 52 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

然後,您可能必須從每個響應的標題中提取它們。 –