Scrapy не анализирует page_source из Selenium

#python #selenium #scrapy

#python #selenium #scrapy

Вопрос:

Я пытаюсь создать spider с Selenium, который будет искать продавцов вhttps://www.trustpilot.com а затем извлекает рейтинг дерева из поиска. Поскольку есть много продавцов, которые нужно найти, я создал список, который мы просматриваем, а затем сохраняем page_source в списке. Идея в том, что этот список page_source должен затем быть проанализирован Scrapy и вернуть файл .json с рейтингом продавца. После запуска spider я вижу, что результатом является 0 просмотренных страниц и пустой файл .json. Кажется, не могу понять, почему ничего не анализируется. вот мой код:-

 # -*- coding: utf-8 -*-
import scrapy
from scrapy import Selector
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from shutil import which

queries = ['yeewtuden.com', '1a.lv', 'grishkoshop.com']


class SeleniumTestSpider(scrapy.Spider):
    name = 'selenium_test'
    allowed_domains = ['www.trustpilot.com']
    start_urls = ["www.trustpilot.com"]

    page_responses = []

    def __init__(self):
        super().__init__()
        chrome_options = Options()
        chrome_options.add_argument("--headless")

        chrome_path = which("chromedriver")

        driver = webdriver.Chrome(executable_path=chrome_path, options=chrome_options)
        driver.implicitly_wait(10)
        driver.get("https://www.trustpilot.com")

        # search_field = driver.find_element_by_xpath("//input[@class='searchInputField___3e9zp']")

        for query in queries:
            search_field = WebDriverWait(driver, 7).until(EC.presence_of_element_located((
                By.CLASS_NAME, 'searchInputField___3e9zp')))
            search_field = driver.find_element_by_xpath("//input[@class='searchInputField___3e9zp']")
            search_field.send_keys(query)
            search_field.send_keys(Keys.ENTER)
            self.page_responses.append(driver.page_source)
            driver.back()

        driver.close()

    def parse(self, response):
        for resp in self.page_responses:
            resp = Selector(text=resp)
            score = resp.xpath("//p[@class='header_trustscore']/text()").get()
            yield {
                'rating': score
            }
  

Комментарии:

1. любая конкретная цель для использования yield { 'rating': score } в вашем коде.

2. Вот как меня научили выводить результаты с использованием scrapy в формате json

3. Я просмотрел ваш полный код и выполнил шаг за шагом, все выглядит хорошо. Пожалуйста, проверьте ответ, который поможет вам получить рейтинг.

4. Вы точно вставили код? И вы запускали его через cmd или IDE?

5. Через PyCharm IDE.

Ответ №1:

Вы можете использовать приведенный ниже код, который вернет рейтинг.

Создайте объект класса и создайте генератор, который будет использоваться для получения рейтинга.

 testSpider = SeleniumTestSpider()
parseGenerator = testSpider.parse(testSpider.page_responses)
for i in parseGenerator:
    print(i, end=" ")