Я пытаюсь почистить данные с сайта Amazon на Индии.Я не могу собрать ответ и проанализировать элементы с помощью метода yield (), когда: 1) мне нужно перейти со страницы продукта на страницу обзора 2) мне нужно перейти с одной страницы обзора на другую страницу обзора
Страница продукта
Страница просмотра
Поток кода:
1) customerReviewData () вызывает getCustomerRatingsAndComments (response)
2) getCustomerRatingsAndComments (response) находит URL страницы обзора и вызывает метод запроса yield с getCrrFromReviewPage (request) в качестве метода обратного вызова с URL этой страницы обзора
3) getCrrFromReviewPage ()получает новый ответ первой страницы обзора, очищает все элементы первой страницы обзора (загруженная страница) и добавляет его в customerReviewDataList []
4) получает URL следующей страницы, если она существует, и рекурсивно вызывает getCrrFromReviewPage () и сканировать элементы со следующей страницы, пока не будет просканирована вся страница обзора
5) Все отзывы добавляются вcustomerReviewDataList []
Я пытался поиграть с помощью yield (), изменив параметры, а также посмотрел документацию scrap для 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 [], я не могу увидеть данные в консоли.
Я могу очистить все отзывы в customerReviewDataList [], если они присутствуют на странице продукта,
В этом сценарии, где я должен использовать функцию выхода, я получаю вывод, указанный выше, как этот [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']}]}
Любая помощь приветствуется.Заранее спасибо.