我正在尝试使用Scrapy抓取一个网站。示例链接是:Here。 我可以使用css选择器获取一些数据。我还需要获取每个项目的所有图像网址。现在一件商品可以有多种颜色。当我们点击另一种颜色时,它实际上是从浏览器中的另一个URL获取图像。所以,我需要生成手动请求(由于多种颜色)并附加" meta"将来自其他网址的图片网址存储到单个项目字段。
这是我的Scrapy代码:
def get_image_urls(self, response):
item = response.meta['item']
if 'image_urls' in item:
urls = item['image_urls']
else:
urls = []
urls.extend(response.css('.product-image-link::attr(href)').extract())
item['image_urls'] = urls
next_url = response.css('.va-color .emptyswatch a::attr(href)').extract()
#print(item['image_urls'])
yield Request(next_url[0], callback=self.get_image_urls, meta={'item': item})
def parse(self, response):
output = JulesProduct()
output['name'] = self.get_name(response)
# Now get the recursive img urls
response.meta['item'] = output
self.get_image_urls(response)
return output
理想情况下,我应该返回输出对象以获得所有必需的数据。我的问题是为什么我没有得到输出[' image_urls']?因为当我在get_image_urls函数中取消注释print语句时,我会看到3个已爬网的URL和3个打印语句,其中url会相互追加。我在解析函数中需要它们。我不确定我是否能够决定我的问题。有人可以帮忙吗?
答案 0 :(得分:0)
你的parse方法在get_image_urls请求完成之前返回输出。
您应该只返回或返回最终项目,并在递归逻辑结束时。这样的事情应该有效:
def parse(self, response):
output = JulesProduct()
output['name'] = self.get_name(response)
yield Request(response.url, callback=self.get_image_urls, meta={'item': item}, dont_filter=True)
def get_image_urls(self, response):
item = response.meta['item']
if 'image_urls' in item:
urls = item['image_urls']
else:
urls = []
urls.extend(response.css('.product-image-link::attr(href)').extract())
item['image_urls'] = urls
next_url = response.css('.va-color .emptyswatch a::attr(href)').extract()
if len(next_url) > 0:
yield Request(next_url[0], callback=self.get_image_urls, meta={'item': item})
else:
yield item