Python URL因scrapy中的时间戳身份验证而过期
我试图在英国亚马逊杂货店搜索,为了获得杂货店类别,我使用了关联产品广告api。我的请求进入队列,但是由于请求的到期时间为15分钟,一些请求在进入队列15分钟后被爬网,这意味着它们在爬网时过期,并产生400错误。我正在考虑一种将请求成批排队的解决方案,但如果实现控制成批处理请求,那么即使这样也会失败,因为问题是成批准备请求,而不是成批处理请求。不幸的是,Scrapy几乎没有这个用例的文档,所以如何批量准备请求呢Python URL因scrapy中的时间戳身份验证而过期,python,scrapy,web-crawler,amazon,scrapy-spider,Python,Scrapy,Web Crawler,Amazon,Scrapy Spider,我试图在英国亚马逊杂货店搜索,为了获得杂货店类别,我使用了关联产品广告api。我的请求进入队列,但是由于请求的到期时间为15分钟,一些请求在进入队列15分钟后被爬网,这意味着它们在爬网时过期,并产生400错误。我正在考虑一种将请求成批排队的解决方案,但如果实现控制成批处理请求,那么即使这样也会失败,因为问题是成批准备请求,而不是成批处理请求。不幸的是,Scrapy几乎没有这个用例的文档,所以如何批量准备请求呢 from scrapy.spiders import XMLFeedSpider fr
from scrapy.spiders import XMLFeedSpider
from scrapy.utils.misc import arg_to_iter
from scrapy.loader.processors import TakeFirst
from crawlers.http import AmazonApiRequest
from crawlers.items import (AmazonCategoryItemLoader)
from crawlers.spiders import MySpider
class AmazonCategorySpider(XMLFeedSpider, MySpider):
name = 'amazon_categories'
allowed_domains = ['amazon.co.uk', 'ecs.amazonaws.co.uk']
marketplace_domain_name = 'amazon.co.uk'
download_delay = 1
rotate_user_agent = 1
grocery_node_id = 344155031
# XMLSpider attributes
iterator = 'xml'
itertag = 'BrowseNodes/BrowseNode/Children/BrowseNode'
def start_requests(self):
return arg_to_iter(
AmazonApiRequest(
qargs=dict(Operation='BrowseNodeLookup',
BrowseNodeId=self.grocery_node_id),
meta=dict(ancestor_node_id=self.grocery_node_id)
))
def parse(self, response):
response.selector.remove_namespaces()
has_children = bool(response.xpath('//BrowseNodes/BrowseNode/Children'))
if not has_children:
return response.meta['category']
# here the request should be configurable to allow batching
return super(AmazonCategorySpider, self).parse(response)
def parse_node(self, response, node):
category = response.meta.get('category')
l = AmazonCategoryItemLoader(selector=node)
l.add_xpath('name', 'Name/text()')
l.add_value('parent', category)
node_id = l.get_xpath('BrowseNodeId/text()', TakeFirst(), lambda x: int(x))
l.add_value('node_id', node_id)
category_item = l.load_item()
return AmazonApiRequest(
qargs=dict(Operation='BrowseNodeLookup',
BrowseNodeId=node_id),
meta=dict(ancestor_node_id=node_id,
category=category_item)
)
一种方法是: 由于有两个地方可以生成请求,因此您可以利用
priority
属性对来自parse
方法的请求进行优先级排序:
class MySpider(Spider):
name = 'myspider'
def start_requests(self):
for url in very_long_list:
yield Request(url)
def parse(self, response):
for url in short_list:
yield Reuest(url, self.parse_item, priority=1000)
def parse_item(self, response):
# parse item
在本例中,scrapy将优先处理来自parse
的请求,这将允许您避免时间限制
请参阅有关请求的详细信息。优先级:
优先级(int)–此请求的优先级(默认为0)。调度程序使用优先级定义用于处理请求的顺序。优先级值较高的请求将更早执行。允许负值,以指示相对较低的优先级
在上,你能发布一些蜘蛛代码吗?通常人们只是用
spider\u idle
信号批处理请求-当spider空闲时,弹出一个批并安排一些请求,请参阅我的相关回答:我用参考代码@Granitosaurus更新了注释