Scrapy:在输出中保留刮擦项目的原始顺序

Scrapy: retain original order of scraped items in the output

我有以下 Scrapy 蜘蛛从文件中的 url 列表中获取页面的状态 url.txt

import scrapy
from scrapy.contrib.spiders import CrawlSpider
from pegasLinks.items import StatusLinkItem

class FindErrorsSpider(CrawlSpider):
    handle_httpstatus_list = [404,400,401,500]
    name = "findErrors"

    allowed_domains = ["domain-name.com"]
    f = open("urls.txt")
    start_urls = [url.strip() for url in f.readlines()]
    f.close()

    def parse(self, response):
        item = StatusLinkItem()
        item['url'] = response.url
        item['status'] = response.status
        yield item

这是我的 items.py 文件:

import scrapy

class StatusLinkItem(scrapy.Item):
    url = scrapy.Field()
    status = scrapy.Field()

我使用以下命令获取 CSV 格式的项目输出:

scrapy crawl findErrors -o File.csv

输出文件中项目的顺序与 urls.txt 文件中相应网址的顺序不同。我怎样才能保留原始订单或使用某种全局变量向 items.py 添加另一个字段,该变量将代表 url 的 id,我以后可以用它恢复原始订单?

您不能依赖 start_urls 中的顺序或网址。

您可以执行以下操作。在创建的 Request 个对象中覆盖 start_requests method in your spider to add something like index parameter into meta 字典。

def start_requests(self):
    for index, url in enumerate(self.start_urls):
        yield  Request(url, dont_filter=True, meta={'index': index})

稍后您可以使用 response.meta.

parse 函数中访问 meta