当前位置: 首页 > 知识库问答 >
问题:

如何使用屈服函数从多个页面中抓取数据

相洛华
2023-03-14

我正试图从亚马逊印度网站上搜集数据。在以下情况下,我无法使用yield()方法收集响应并解析元素:1)我必须从一个产品页面移动到另一个审阅页面2)我必须从一个审阅页面移动到另一个审阅页面

产品页

评论页

代码流:

1) customerReviewData()调用getCustomerRatingsAndComments(响应)

2) GetCustomerRatings和Comments(response)查找审阅页面的URL,并使用getCrrFromReviewPage(request)作为回调方法调用收益请求方法,使用此审阅页面的URL

3)getCrrFromRevewPage()获取firstreet view页面的新响应,并从第一个评论页面(页面加载)中抓取所有元素,并将其添加到客户端评论数据列表[]

4)获取下一页的URL(如果存在),并递归调用getCrrFromRevewPage()方法,从下一页抓取元素,直到抓取所有的评论页面

5)所有的评论被添加到客户评论DataList[]

我尝试过使用yield()修改参数,还查阅了有关yield()和请求/响应yield()的详细文档

# -*- coding: utf-8 -*-
import scrapy
import logging

customerReviewDataList = []
customerReviewData = {}

#Get product name in <H1>
def getProductTitleH1(response):
    titleH1 =  response.xpath('normalize-space(//*[@id="productTitle"]/text())').extract()
    return titleH1

def getCustomerRatingsAndComments(response):
    #Fetches the relative url
    reviewRelativePageUrl = response.css('#reviews-medley-footer a::attr(href)').extract()[0]
    if reviewRelativePageUrl:
        #get absolute URL
        reviewPageAbsoluteUrl = response.urljoin(reviewRelativePageUrl)
        yield Request(url = reviewPageAbsoluteUrl, callback = getCrrFromReviewPage())
        self.log("yield request complete")

    return len(customerReviewDataList)

def getCrrFromReviewPage():

    userReviewsAndRatings = response.xpath('//div[@id="cm_cr-review_list"]/div[@data-hook="review"]')


    for userReviewAndRating in userReviewsAndRatings:
        customerReviewData[reviewTitle] = response.css('#cm_cr-review_list .review-title span ::text').extract()
        customerReviewData[reviewDescription] = response.css('#cm_cr-review_list .review-text span::text').extract()
        customerReviewDataList.append(customerReviewData) 

    reviewNextPageRelativeUrl = response.css('#cm_cr-pagination_bar .a-pagination .a-last a::attr(href)')[0].extract()

    if reviewNextPageRelativeUrl:
        reviewNextPageAbsoluteUrl = response.urljoin(reviewNextPageRelativeUrl)
        yield Request(url = reviewNextPageAbsoluteUrl, callback = getCrrFromReviewPage())


class UsAmazonSpider(scrapy.Spider):
    name = 'Test_Crawler'
    allowed_domains = ['amazon.in']
    start_urls = ['https://www.amazon.in/Philips-Trimmer-Cordless-Corded-QT4011/dp/B00JJIDBIC/ref=sr_1_3?keywords=philips&qid=1554266853&s=gateway&sr=8-3']

    def parse(self, response):
        titleH1 = getProductTitleH1(response),
        customerReviewData = getCustomerRatingsAndComments(response)

        yield{
        'Title_H1' : titleH1,
        'customer_Review_Data' : customerReviewData
        }


我得到了以下回应:

{'Title_H1': (['Philips Beard Trimmer Cordless and Corded for Men QT4011/15'],), 'customer_Review_Data': <generator object getCustomerRatingsAndComments at 0x048AC630>}

“Customer_review_Data”应该是标题和审查的裁决列表

我不知道我在这里犯了什么错误。

当我使用log()或print()查看customerReviewDataList[]中捕获的数据时,也无法在控制台中查看数据。

我能够刮所有的评论在客户评论DataList[],如果他们存在于产品页面,

在这个场景中,我必须使用屈服函数,我得到的输出如上所述[https://ibb.co/kq8w6cf]

这就是我想要的输出:

{'customerReviewTitle': ['Difficult to find a charger adapter'],'customerReviewComment': ['I already have a phillips trimmer which was only cordless. ], 'customerReviewTitle': ['Good Product'],'customerReviewComment': ['Solves my need perfectly HK']}]}

任何帮助都很感激。提前感谢。

共有1个答案

戚阳
2023-03-14

您应该完成Scrapy教程。下面的链接部分应该对您特别有帮助。

这是代码的简化版本:

def data_request_iterator():
    yield Request('https://example.org')

class MySpider(Spider):
    name = 'myspider'
    start_urls = ['https://example.com']

    def parse(self, response):
        yield {
            'title': response.css('title::text').get(),
            'data': data_request_iterator(),
        }

相反,它应该是这样的:

class MySpider(Spider):
    name = 'myspider'
    start_urls = ['https://example.com']

    def parse(self, response):
        item = {
            'title': response.css('title::text').get(),
        }
        yield Request('https://example.org', meta={'item': item}, callback=self.parse_data)

    def parse_data(self, response):
        item = response.meta['item']
        # TODO: Extend item with data from this second response as needed.
        yield item
 类似资料:
  • 问题内容: 我正在尝试从PGA.com网站上获取数据,以获取美国所有高尔夫球场的表格。在我的CSV表中,我想包括高尔夫球场的名称,地址,所有权,网站,电话号码。有了这些数据,我想对其进行地理编码并放入地图中,并在计算机上拥有本地副本 我利用Python和Beautiful Soup4提取了我的数据。到目前为止,我已经提取了数据并将其导入CSV,但是现在我遇到了从PGA网站上的多个页面抓取数据的问题

  • 主要内容:多级页面分析,爬虫增量抓取,程序代码实现前面讲解的爬虫案例都是单级页面数据抓取,但有些时候,只抓取一个单级页面是无法完成数据提取的。本节讲解如何使用爬虫抓取多级页面的数据。 在爬虫的过程中,多级页面抓取是经常遇见的。下面以抓取二级页面为例,对每级页面的作用进行说明: 一级页面提供了获取二级页面的访问链接。 二级页面作为详情页用来提取所需数据。 一级页面以 标签的形式链接到二级页面,只有在二级页面才可以提取到所需数据。 多级页面分析 下面

  • 我想刮从多个网站与类似的网址的,如https://woollahra.ljhooker.com.au/our-team, https://chinatown.ljhooker.com.au/our-team和https://bondibeach.ljhooker.com.au/our-team. 我已经写了一个脚本,第一个网站的工作,但我不知道如何告诉它从其他两个网站刮。 我的代码: 有没有一种方

  • 最近,我一直试图从一个网站上获取大量的定价,从一个页面开始,每个项目的页面都链接到起始页面。我希望运行一个脚本,允许我单击某个项目的框,删除该项目的定价和描述,然后返回起始页并继续该循环。然而,有一个明显的问题,我在刮掉第一件物品后遇到了。返回起始页后,容器没有定义,因此出现了一个陈旧的元素错误,该错误会中断循环并阻止我获取其余的项。这是我使用的示例代码,希望能够一个接一个地刮去所有项目。 然而,

  • 问题内容: 我正在尝试抓取此网站:http : //data.eastmoney.com/xg/xg/ 到目前为止,我已经使用selenium执行javascript并抓取了表格。但是,现在我的代码仅使我获得第一页。我想知道是否有一种方法可以访问其他17个页面,因为当我单击下一页时,URL不会更改,因此我不能每次都遍历另一个URL 下面是我到目前为止的代码: 还是我每次单击后都可以使用webdri

  • 本文向大家介绍PHP cURL库函数抓取页面内容,包括了PHP cURL库函数抓取页面内容的使用技巧和注意事项,需要的朋友参考一下 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议和选项,如HTTP、FTP、TELNET等,能提供 URL 请求相关的各种细节信息。最爽的是,PHP 也支持 cURL 库。 本文将介绍 cURL 的一些高级特性,以及在 PHP 中如何运用它。 1