Python Scrapy-如何从另一个spider方法调用变量?

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

所以我试图学习scrapy,对于学习项目,我想刮取这个网站的项目名称(仅从1个类别atm),然后输入这些项目URL并抓取描述文本

我已经得到一些关于编写2个spider的建议,但我不知道如何从parse方法中的变量中从第一个spider获取数据到第二个spider以填充start\u URL

这就是我所处的位置:

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()
    而不是
    extract\u first()
    ,它更简洁,总是会给你一个字符串,而scrapy docs会建议你这样做
  • 不要将使用
    getall()
    extract()
    混淆。有时候extract()会给你一个列表或字符串,
    getall()
    总会给你一个列表
  • 使用项目字典,而不是生成字典。尤其是在数据不干净的情况下
需要了解的概念 项目 条目词典是scrapy收集数据的最佳方式。如果需要的话,它允许您更改以后输入和输出的数据。它比词典更灵活。 要开始使用项,需要在items.py中包含要用作潜在列的字段名。在本例中,名称、URL、说明

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很难,但要坚持下去。它确实变得容易了。