scrapy解析函数未被调用-也是批量保存

yyhrrdl8  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(169)

我发现类似的问题已经被问过了,但没有一个答案解释了我的情况。我还需要帮助实现我的代码的第二部分。
这里的代码:

import scrapy
import json

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

   def start_requests(self):
       urls = [
           'https://www.lin1.com',
           'https://www.link2.com'
       ]
       for url in urls:
           yield scrapy.Request(url= url,  callback=self.parse_result, meta={'url':url})

   def parse_result(self, response):
       url = response.meta['url']
       tag = response.xpath('//xxxxxxx/text()').get()
       if tag is not None:
           jsonData = json.loads(tag)
           items_list = jsonData['x']['y']['z']
           for index, item in enumerate(items_list):
                   self.parse_item(item, index + 1, url)

                ################ # IF I yield here I get some output #########################
                  # yield {
                  #      'url': url,
                  #     'index': index,
                  #     'title': item.get('name'),
                  #     'link': item.get('itemUrl'),
                  #     'item_id': item.get('itemId'),
                  #     'rating': item['rating'].get('averageRating'),
                  #     'price': item.get('price')
                  # }

           # Request Next Page
           next_page = response.css('li.next a::attr(href)').get

           if next_page is not None:
               yield response.follow(next_page, callback = self.parse_result , meta={'url': 
                     url})
               #yield scrapy.Request(url= url+next_page, callback = self.parse_result, meta= 
                   {'url': url})

   def parse_item(self, item_data, index, url):
        #############  This is not getting called ##############
        yield {
             'url': url,
             'index': index,
             'title': item_data.get('name'),
             'link': item_data.get('itemUrl'),
             'item_id': item_data.get('itemId'),
             'rating': item_data['rating'].get('averageRating'),
             'price': item_data.get('price')            
          }

1 -当我直接从parse_result函数中产生时,我至少会得到一些输出,但是当我使用parse_item函数时,什么都不显示2-另外,我如何在将其发送到前端之前将一个(url)中的所有项目放入列表中?谢谢你的帮助。

2o7dmzc5

2o7dmzc51#

parse_item方法不产生任何输出的原因是因为parse_result方法没有产生输出。要解决这个问题,您可以轻松地在parse_result方法中的方法调用前面添加yield语句。我还将parse_items中的yield改为return,因为您只返回一个字典。
您也可以通过访问response.url属性来获取当前请求的url,除非您被重定向,在这种情况下,您可以使用response.request.url属性。
例如:

def parse_result(self, response):
       url = response.url
       tag = response.xpath('//xxxxxxx/text()').get()
       if tag is not None:
           jsonData = json.loads(tag)
           items_list = jsonData['x']['y']['z']
           for index, item in enumerate(items_list):
               yield self.parse_item(item, index + 1, url)
           next_page = response.css('li.next a::attr(href)').get
           if next_page is not None:
               yield response.follow(next_page, callback=self.parse_result)
          

   def parse_item(self, item_data, index, url):
        return {
             'url': url,
             'index': index,
             'title': item_data.get('name'),
             'link': item_data.get('itemUrl'),
             'item_id': item_data.get('itemId'),
             'rating': item_data['rating'].get('averageRating'),
             'price': item_data.get('price')            
          }

相关问题