【发布时间】:2016-11-21 09:06:09
【问题描述】:
我正在尝试创建一个蜘蛛,它从 csv 获取数据(每行两个链接和一个名称),并从每个链接中抓取一个简单的元素(价格),为每一行返回一个项目,该项目的name 是 csv 中的名称,以及两个抓取的价格(每个链接一个)。
一切都按预期工作,除了从每个请求的回调函数返回的价格,而不是返回价格,我得到一个像这样的请求对象:
https://link.com>..
回调函数根本没有被调用,这是为什么呢?
这是蜘蛛:
f = open('data.csv')
f_reader = csv.reader(f)
f_data = list(f_reader)
parsed_data = []
for product in f_data:
product = product[0].split(';')
parsed_data.append(product)
f.close()
class ProductSpider(scrapy.Spider):
name = 'products'
allowed_domains = ['domain1', 'domain2']
start_urls = ["domain1_but_its_fairly_useless"]
def parse(self, response):
global parsed_data
for product in parsed_data:
item = Product()
item['name'] = product[0]
item['first_price'] = scrapy.Request(product[1], callback=self.parse_first)
item['second_price'] = scrapy.Request(product[2], callback=self.parse_second)
yield item
def parse_first(self, response):
digits = response.css('.price_info .price span').extract()
decimals = response.css('.price_info .price .price_demicals').extract()
yield float(str(digits)+'.'+str(decimals))
def parse_second(self, response):
digits = response.css('.lr-prod-pricebox-price .lr-prod-pricebox-price-primary span[itemprop="price"]').extract()
yield digits
提前感谢您的帮助!
【问题讨论】:
-
有点跑题了,但你不应该使用这样的全局变量,并且像这样写入文件也是一个坏主意。 Scrapy 可以自动生成
csv和scrapy crawl spider -o output.csv。 -
没有 global 怎么办?我知道这是个坏习惯,但我不知道该怎么做。CSV 仅用于读取现有文件。我使用 openpyxl 导出到 excel
-
啊,我知道你想在这里做什么。为什么不使用简单的实例变量?在注释中显示代码确实很难,但您应该研究
__init__在 python 中的工作方式以及实例和类变量是什么。
标签: python web-scraping request scrapy scrapy-spider