python - Scrapy:如何使用来自两个网站的数据填充项目

标签 python scrapy

我想从 2 个不同的网站收集商品的数据。

它应该按如下方式工作:

  1. parse_website_1 从 website_1 获取人名并填充 该项目
  2. parse_website_1 生成对 parse_website_2 的请求
  3. parse_website_2 解析 website_2,根据从 website_1 抓取的人名收集人的头发颜色并填充项目
  4. parse_website_2 加载项目

考虑到该项目是在 items.py 中定义的,这是否是正确的方向:

import scrapy
from scrapy.loader import ItemLoader
from myproject.items import MyItem

class MySpider(scrapy.Spider):

    name = "myspider" 

    def __init__(self):
        self.item = ItemLoader(item=MyItem(), response=response)  

    def start_requests(self):
        scrapy.Request(url="http://website_1.com", callback=self.parse_website_1)

    def parse_website_1(self, response):   
        name = response.xpath('//div[@class="name"]/text()').extract_first()
        self.item.add_value("name", name)
        website_2_path = "http://website_2.com/" + name 
        yield scrapy.Request(url=website_2_path, callback=self.parse_website_2)

    def parse_website_2(self, response):
        self.item.add_xpath("hair_color", '//div[@class="hair_color"]')
        yield self.item.load_item() 

最佳答案

想法是正确的,但实现不正确,因为您尝试使用实例属性 (self.item) 在连续请求之间传递数据。 Scrapy 请求是异步的,因此它不会按预期工作。

Scrapy FAQ 中概述了正确的操作方法。 。使用 Requestmeta 属性将部分项目数据传递给连续请求,您可以使用 Responsemeta 获取它> 属性,添加更多数据并最终生成项目。这是改编后的代码:

import scrapy
from scrapy.loader import ItemLoader
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = "myspider" 

    def start_requests(self):
        scrapy.Request(url="http://website_1.com", callback=self.parse_website_1)

    def parse_website_1(self, response):   
        item = ItemLoader(item=MyItem(), response=response)
        name = response.xpath('//div[@class="name"]/text()').extract_first()
        item.add_value("name", name)
        website_2_path = "http://website_1.com/" + name 
        yield scrapy.Request(url=website_2_path, callback=self.parse_website_2, meta={'item': item})

    def parse_website_2(self, response):
        item = response.meta['item']
        item.add_xpath("hair_color", '//div[@class="hair_color"]')
        yield item.load_item()

关于python - Scrapy:如何使用来自两个网站的数据填充项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48433812/

相关文章:

python - 如何通过 python 修改 mysql 数据库中存在的列?

不读取文件的Python密码验证

python如何仅使用一个函数从列表中形成最大可能的数字

python - 使用scrapy时如何修复 “TypeError: Cannot mix str and non-str arguments”?

python - 如何计算Scrapy中的空响应数?

python - 计算 pandas 数据帧的百分位并将二进制值分配给新列

python - 如何从一行文本创建字典?

python - Scrapy 自定义设置

python - Scrapy 爬取带有 PostBack 数据 javascript url 的页面不会改变

python - 如何使用scrapy的XmlFeedSpider解析sitemap.xml文件?