#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-ю страницу