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
我有以下 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