我有以下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,以便我以后可以恢复原始订单?
答案 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
。