Python Scrapy-如何从另一个spider方法调用变量?
所以我试图学习scrapy,对于学习项目,我想刮取这个网站的项目名称(仅从1个类别atm),然后输入这些项目URL并抓取描述文本 我已经得到一些关于编写2个spider的建议,但我不知道如何从parse方法中的变量中从第一个spider获取数据到第二个spider以填充start\u URL 这就是我所处的位置:Python Scrapy-如何从另一个spider方法调用变量?,scrapy,python-3.7,Scrapy,Python 3.7,所以我试图学习scrapy,对于学习项目,我想刮取这个网站的项目名称(仅从1个类别atm),然后输入这些项目URL并抓取描述文本 我已经得到一些关于编写2个spider的建议,但我不知道如何从parse方法中的变量中从第一个spider获取数据到第二个spider以填充start\u URL 这就是我所处的位置: import scrapy class Names(scrapy.Spider): name = 'killernames' start_urls = ['ht
import scrapy
class Names(scrapy.Spider):
name = 'killernames'
start_urls = ['https://www.killertools.com/Dent-Removal-Aluminum-Steel_c_11.html?viewall=1',]
def parse(self, response):
self.detail = response.xpath('//div[contains(@class, "product-item")]/div[@class="name"]/a/@href').getall()
for item in response.xpath('//div[@class="name"]'):
yield {
'name': item.xpath('./a/text()').extract_first(),
'url': item.xpath('./a/@href').extract_first(),
}
class Detail(scrapy.Spider):
name = 'killerdetail'
start_urls = []
for item in self.detail: (I dont know how to get it from first spider)
url = 'https://www.killertools.com/' + item
start_urls.append(url)
def parse(self, response):
for item in response.xpath('//div[@itemprop="description"]'):
yield {
'detail': item.xpath('./p/strong/text()').extract_first(),
}
您不必使用两个spider,而是可以使用一个spider跟踪各个页面上的链接。首先是关于创建爬行器的几点,然后是进行这种类型的刮取需要了解的一些概念。然后是下面的代码示例和解释 代码审查
- 使用
而不是get()
,它更简洁,总是会给你一个字符串,而scrapy docs会建议你这样做extract\u first()
- 不要将使用
与getall()
混淆。有时候extract()会给你一个列表或字符串,extract()
总会给你一个列表getall()
- 使用项目字典,而不是生成字典。尤其是在数据不干净的情况下
items['name] = ...
items.py
进口羊瘙痒
class KillerItem(scrapy.Item):
name = scrapy.Field()
url = scrapy.Field()
description = scrapy.Field()
我们正在创建一个KillerItem类,它是scrapy.Item的子类。我们正在实例化Field()对象,并将其命名为我们希望作为列生成的名称
您还需要在spider脚本中包含
from ..items import KillerItem
这是相对重要的。。表示items.py所在的父目录。
KillerItem是一个需要实例化以创建items字典的类。我们按照下面的代码来做
items = KillerItem()
它创建了items字典,但它的键与我们在items.py中创建的字段名相对应。因此,我们现在可以用对应于所需数据的值填充这些键。在本例中,输入名称、URL和说明
items['name] = ...
当我们填充完条目字典后,我们必须使用产生条目
。这一点很重要,因为当我们拥有每个单独页面的名称、URL和描述时,我们希望得到它
元参数的使用
您可以通过scrapy请求的元参数在函数之间传递变量。meta参数接受一个字典,在本例中,我们希望使用name和url传递在parse函数中创建的条目字典。我们想用各个页面的描述填充这个条目字典。我们通过创建一个带有键的字典来实现这一点,该键由我们选择,然后该值就是我们在实例化KillerItems类时定义的items字典
meta= {'items',items}
要在下一个函数中访问此项词典,即在其中对各个页面进行解析。我们可以通过响应访问
items = response.meta['items']
我们与items变量保持一致,并通过meta['items'访问值
现在我们已经解释了这一点,我们可以继续代码示例
代码示例
解释
在parse函数中没有太多更改,我们使用xpath选择器为name和URL创建值。我们填充与在items.py中创建的字段名对应的items键
。我们使用response.follow方法,在参数中,我们为for循环的每次迭代指定一个URL,即items['URL'],以及我们调用的回调函数self.page
,我们还有一个元参数,它创建了一个简单的名称项字典,并创建了项字典的值,以将项字典传递给parse函数
不幸的是,在pages函数中,我们有很多elif语句,因为每个页面的描述都不一致
最后,我们生成条目字典,现在我们有了每个页面的描述
你没有具体说明要点,但如果你需要,你应该有足够的时间去争取额外的日期。先生,你是男人中的上帝!可悲的是,我还没有一位代表投票支持这一点,但你基本上为我节省了一周多的阅读文档的时间,而我几乎不理解这些文档,因此可能还要多花一周的时间来盲测什么能做什么。4个月前,我开始在python上观看一些终极初学者的东西,比如打印(“Hello World!”)级别的东西。仍然有很多概念把我弄糊涂了,尤其是在后台工作的框架中。因此,对我来说,通过剖析工作示例来学习是最容易的。再次感谢!不客气!你能在我的答案左边打勾吗?谢谢Python很难,但要坚持下去。它确实变得容易了。