Python URL因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

我试图在英国亚马逊杂货店搜索,为了获得杂货店类别,我使用了关联产品广告api。我的请求进入队列,但是由于请求的到期时间为15分钟,一些请求在进入队列15分钟后被爬网,这意味着它们在爬网时过期,并产生400错误。我正在考虑一种将请求成批排队的解决方案,但如果实现控制成批处理请求,那么即使这样也会失败,因为问题是成批准备请求,而不是成批处理请求。不幸的是,Scrapy几乎没有这个用例的文档,所以如何批量准备请求呢

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更新了注释