Scrapy:保留输出

时间:2015-05-12 11:32:49

标签: python scrapy

我有以下Scrapy蜘蛛从文件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

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

1 个答案:

答案 0 :(得分:2)

您不能依赖start_urls中的订单或网址。

你可以做以下事情。覆盖您的蜘蛛中的start_requests方法,将index参数添加到已创建的Request对象中的meta字典中。

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

稍后,您可以使用response.meta访问meta功能中的parse