我做错了什么?解析项目页面对我无效

2024-03-28 13:03:29 发布

您现在位置:Python中文网/ 问答频道 /正文

import scrapy
from ..items import dealItem

class FarmtoolsSpider(scrapy.Spider):
    name = 'farmtools'
    allowed_domains = ['www.deal.ie']
    start_urls = ['https://www.deal.ie/all?source=private&sort=publishdate%20desc']

    def parse(self, response):
        items = dealItem()
        rows = response.xpath('//ul[@class="card-collection"]/li')

        for row in rows:
            link = row.xpath('.//a/@href').get() #this is the full link.
            link_split = link.split('/')[-1] #this splits the url link th first time.
            linkid = link_split.split('?')[0] #this splits it the second time.
            title = row.xpath('.//div[1]/p[@class="card__body-title"]/text()').get()
            county = row.xpath('.//a/div/div[2]/div[1]/ul[@class="card__body-keyinfo"]/li[contains(text(),"min")]/following-sibling::node()/text()').get()
            price = row.xpath('.//p[@class="card__price"]/span[1]/text()').get()
            subcat = row.xpath('.//a/div/div[2]/div[1]/p[2]/text()[2]').get()
            zero = row.xpath('.//a/div/div[2]/div[1]/ul[@class="card__body-keyinfo"]/li[contains(text(),"min")]/text()').get()
            if zero == '0 min':

                items['linkid'] = linkid
                items['title'] = title
                items['county'] =  county
                items['price'] = price
                items['subcat'] = subcat
                items['zero'] = zero
                items['link'] = link



                yield response.follow(url=link,
                callback=self.parse_item_page,
                cb_kwargs={link: items})

    def parse_item_page(self, response, link):
        items = DonedealItem()

        rows = response.xpath('//html/body/main/div/div[1]/div')
        for row in rows:
            views = row.xpath('.//div[2]/div[2]/div[1]/div[3]/div[1]/div/div[1]/div/div/span[2]/text()').get()
            seller_id = row.xpath('.//div[2]/div[2]/div[2]/div[3]/div/div[1]/div[1]/div[2]/a/@href').get()
            seller_ads = row.xpath('.//div[2]/div[2]/div[2]/div[3]/div/div[2]/div/dl[3]/dd/text()').get()
            lifetime_ads = row.xpath('//div[2]/div[2]/div[2]/div[3]/div/div[2]/div/dl[4]/dd/text()').get()

            items['views'] = views
            items['seller_id'] = seller_id
            items['seller_ads'] = seller_ads
            items['lifetime_ads'] = lifetime_ad

        items['views'] = views

        yield{
            items
            }

第一个解析方法运行良好,但我不确定是否正确编写了第二个解析方法

第一个解析方法的一部分会刮取我想要遵循的特定链接,以便我可以从中刮取额外的数据

我想要实现的是从第一个解析方法中获取链接,从中获取其他项值,然后将它们作为项添加到一起

我还向两者添加了items = DonedealItem(),但我不确定这是否正确

当我现在运行它时,我得到了:File“/home/william/.local/lib/python3.7/site packages/twisted/internet/defer.py”,第654行,_runcallbackscurrent.result=callback(current.result,*args,**kw)类型错误:parse_item_page()得到了一个意外的关键字参数“donedeal.ie/cars for sale/e39-520i-for-breaking-alling-have-lsd/…”。我得到的每一个链接是刮一个。我想做的是在我从第一个解析方法抓取的信息中添加更多信息,如“卖家id”、“视图”等。希望这有帮助

任何帮助都将不胜感激,谢谢


1条回答
网友
1楼 · 发布于 2024-03-28 13:03:29

我可以发现您的代码存在一些问题,包括您在评论中提到的错误的原因,但是问题仍然存在,因为我不完全理解您想要删除的数据结构。

  • parse方法中,在items变量中实例化一个DonedealItem()对象。然后尝试将其作为回调参数(cb_-kwargs)发送到回调函数(parse_item_page

          ...
          yield response.follow(url=link,
              callback=self.parse_item_page,
              cb_kwargs={link: items})
    
     def parse_item_page(self, response, link):
         ...
    

这里的问题是link是一个具有不可预测值的变量(当您将其设置为url时),它需要是一个与回调函数中定义的值相同的字符串。因此,这应该可以解决错误:

        yield response.follow(url=link,
            callback=self.parse_item_page,
            cb_kwargs={'link': items})

  • 但是,您的parse_item_page方法没有使用link进行任何操作。相反,它实例化一个新的DonedealItem(),用解析到这个方法中的数据填充它,然后生成它。作为link参数接收的数据未被使用。如果要增加第一个parse方法发送给您的数据,您需要使用它:

      def parse_item_page(self, response, link):
          items = link # Your link param already receives an DonedealItem instance.
    

  • 这是一个提示:不需要这些花括号:

     yield{
         items
         }
    

改用yield items


仍然存在的问题:

  • 您可以将DonedealItem视为一个dict,您的代码所做的是先实例化项,然后运行for循环,并在该循环的每次迭代中覆盖项内的数据。我相信您应该在for循环中实例化您的项,但我不能确定,因为我不知道预期的结果是什么,也不知道DonedealItem是如何定义的。即使如此,这仍然会导致第二个解析方法出现问题,因为它接收一个项,然后再次迭代。也许你需要使用列表

相关问题 更多 >