我使用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。
答案 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),