我想从 2 个不同的网站收集商品的数据。
它应该按如下方式工作:
- parse_website_1 从 website_1 获取人名并填充 该项目
- parse_website_1 生成对 parse_website_2 的请求
- parse_website_2 解析 website_2,根据从 website_1 抓取的人名收集人的头发颜色并填充项目
- 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 中概述了正确的操作方法。 。使用 Request
的 meta
属性将部分项目数据传递给连续请求,您可以使用 Response
的 meta
获取它> 属性,添加更多数据并最终生成项目。这是改编后的代码:
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/