Проблема разбиения на страницы Python Scrapy-Selenium

#python #selenium #pagination #scrapy

#python #selenium #разбивка на страницы #scrapy

Вопрос:

Я не могу понять, как следить за нумерацией страниц на этом сайте (проверьте start_urls). Что он делает, так это открывает webdriver, успешно захватывает данные с 1-й страницы и при загрузке второй закрывает webdriver и все.

 import scrapy
from lxml.html import fromstring
from ..items import PontsItems
from selenium import webdriver


class Names(scrapy.Spider):
    name = 'enseafr'

    download_delay = 5.0

    start_urls = ['https://www.ponts.org/fr/annuaire/recherche?result=1amp;annuaire_mode=standardamp;annuaire_as_no=amp;keyword=amp;PersonneNom=amp;PersonnePrenom=amp;DiplomePromo[]=2023amp;DiplomePromo[]=2022amp;DiplomePromo[]=2021amp;DiplomePromo[]=2020amp;DiplomePromo[]=2019amp;DiplomePromo[]=2018amp;DiplomePromo[]=2017amp;DiplomePromo[]=2016amp;DiplomePromo[]=2015amp;DiplomePromo[]=2014amp;DiplomePromo[]=2013amp;DiplomePromo[]=2012amp;DiplomePromo[]=2011amp;DiplomePromo[]=2010']

    def __init__(self):
        self.driver = webdriver.Chrome()

    def parse(self, response):
        items = PontsItems()
        self.driver.get(response.url)

        next = self.driver.find_element_by_xpath('//a[@class="next"]')
        #'//*[@id="zoneAnnuaire_layout"]/div[3]/div[2]/div[3]/div[11]/a[4]'
        while True:

            try:
                next.click()

                for item in response.xpath('//div[@class="single_desc"]'):
                    name = item.xpath('./div[@class="single_libel"]/a/text()').get().strip()
                    description = item.xpath('./div[@class="single_details"]/div/text()').get()
                    description = fromstring(description).text_content().strip()
                    year = item.xpath('./div[@class="single_details"]/div/b/text()').get()

                    items['name'] = name
                    items['description'] = description
                    items['year'] = year
                    yield items

            except:
                break

        self.driver.close()
  

Я действительно застрял на этом уже несколько дней.

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

1. Привет, в чем проблема?

2. Я получаю это: selenium.common.exceptions. Исключение StaleElementReferenceException: Сообщение: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы (информация о сеансе: chrome = 85.0.4183.102)

3. если вы используете Chrome для щелчка по элементам, вам следует искать self.driver.page_source вместо response или просто использовать self.driver.find_element_by_xpath вместо response.xpath для поиска значений.

4. Когда я использую self.driver.find_element_by_xpath, я получаю: TypeError: объект ‘WebElement’ не поддается повторению, не говоря уже о чем-то совершенно новом, например [984:16892:0918/012923.411:ОШИБКА: device_event_log_impl.cc(208)] [01:29:23.411] Bluetooth: bluetooth_adapter_winrt.cc: 1074Не удалось получить адаптер по умолчанию. O_o можете ли вы, ребята, объяснить мне эту магию или, что еще лучше, переписать этот скрипт, чтобы он действительно работал в какой-то степени?

5. Сначала поместите следующий внутри try catch.

Ответ №1:

Я не знаю, как использовать PontItems(), но я могу использовать пустой список, чтобы показать, как я буду возвращать данные следующим образом. Он возвращает текущий список, если есть ошибка, и добавляется в список каждый раз, когда вы нажимаете рядом с новой страницей. У вас есть только один элемент, поэтому используйте find_elements .

 items=[]
while True:
    try:
        next = self.driver.find_element_by_xpath('//a[@class="next"]')
        next.click()
        descs = self.driver.find_elements_by_xpath('//div[@class="single_desc"]')
        for item in descs :
            name = item.xpath('./div[@class="single_libel"]/a/text()').get().strip()
            description = item.xpath('./div[@class="single_details"]/div/text()').get()
            description = fromstring(description).text_content().strip()
            year = item.xpath('./div[@class="single_details"]/div/b/text()').get()
            items.append({'name':name,'description':description,'year':year})
    except:
        break
yield items
  

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

1. Вы тестировали его для этого сайта? Для меня единственное, что он меняет, — это получение данных последнего элемента и по-прежнему закрывается перед переходом на 2-ю страницу