Пагинация в selenium
Пытаюсь спарсить сайт dns-shop.ru. Удалось получить информацию по первой странице, но вот перейти на следующую страницу не удается.
Вот сам код
import time
from bs4 import BeautifulSoup as BS
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import requests
# import csv
# csv = smartphone_from_dns-shop
start_time = time.time()
chrome_options = Options()
chrome_options.headless = False
driver_service = Service(executable_path=r"C:\Users\Кирилл\PycharmProjects\DNS_parser\chromedriver.exe")
driver = webdriver.Chrome(service=driver_service)
driver.maximize_window()
driver.implicitly_wait(20)
url = "https://www.dns-shop.ru/catalog/17a8a01d16404e77/smartfony/?p=1"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/100.0.4896.60 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,"
"application/signed-exchange;v=b3;q=0.9 "
}
def start_browser(url):
# Открывем ссылку url
driver.get(url=url)
def get_content():
# Получем html данной страницы, вытаскиваем из него название и цену и сохраняем в список smartphones
soup = BS(driver.page_source, "lxml")
time.sleep(1)
products = soup.find_all(class_="catalog-product__name ui-link ui-link_black")
prices = soup.find_all("div", class_="product-buy__price")
smartphones = []
for i in range(0, len(products)):
smartphones.append(
{
'title': products[i].text,
'price': prices[i].text,
}
)
return smartphones
def parser():
#Пагинация сайта, вставка списка со страницы в общий список
# pagination = int(input('Количество страниц для парсинга:'))
pagination = 1
html = requests.get(url)
if html.status_code == 200:
list_smartphones = []
for page in range(1, pagination+1):
list_smartphones.extend(get_content())
button_pagination_next = driver.find_element(By.CLASS_NAME, 'pagination-widget__page-link pagination-widget__page-link_next ').get_attribute('href')
print(button_pagination_next)
# print("Перешли на следующую страницу")
else:
print("Сайт недоступен")
return list_smartphones
if __name__ == "__main__":
start_browser(url)
result = parser()
print(result)
Пытался найти ссылку на элемент пагинации в html через
button_pagination_next = driver.find_element(By.CLASS_NAME,
'pagination-widget__page-link pagination-widget__page-link_next ').get_attribute('href')
но выдает ошибку
Traceback (most recent call last):
File "F:\Проекты\DNS_parser\main.py", line 73, in <module>
result = parser()
File "F:\Проекты\DNS_parser\main.py", line 61, in parser
button_pagination_next = driver.find_element(By.CLASS_NAME, 'pagination-widget__page-link pagination-widget__page-link_next ').get_attribute('href')
File "C:\Users\Кирилл\PycharmProjects\DNS_parser\pythonProject\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1248, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\Кирилл\PycharmProjects\DNS_parser\pythonProject\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 425, in execute
self.error_handler.check_response(response)
File "C:\Users\Кирилл\PycharmProjects\DNS_parser\pythonProject\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".pagination-widget__page-link pagination-widget__page-link_next "}
(Session info: chrome=100.0.4896.60)
Stacktrace:
Backtrace:
Ordinal0 [0x004E7413+2389011]
Ordinal0 [0x00479F61+1941345]
Ordinal0 [0x0036C658+837208]
Ordinal0 [0x003991DD+1020381]
Ordinal0 [0x0039949B+1021083]
Ordinal0 [0x003C6032+1204274]
Ordinal0 [0x003B4194+1130900]
Ordinal0 [0x003C4302+1196802]
Ordinal0 [0x003B3F66+1130342]
Ordinal0 [0x0038E546+976198]
Ordinal0 [0x0038F456+980054]
GetHandleVerifier [0x00699632+1727522]
GetHandleVerifier [0x0074BA4D+2457661]
GetHandleVerifier [0x0057EB81+569713]
GetHandleVerifier [0x0057DD76+566118]
Ordinal0 [0x00480B2B+1968939]
Ordinal0 [0x00485988+1989000]
Ordinal0 [0x00485A75+1989237]
Ordinal0 [0x0048ECB1+2026673]
BaseThreadInitThunk [0x7591FA29+25]
RtlGetAppContainerNamedObjectPath [0x770A7A7E+286]
RtlGetAppContainerNamedObjectPath [0x770A7A4E+238]
Process finished with exit code 1
Поиск в гугле направил на то, что страница не прогружается, поэтому добавил задержку
driver.implicitly_wait(20)
но ничего не поменялось.
Ответы (2 шт):
Во-первых, если цель не автотестирование пользовательского интерфейса, то не имеет особого смысла имитировать поведение пользователя в виде нажатия на какие-то элементы страницы. Передайте селениуму абсолютный адрес целевой страницы, в вашем случае для второй страницы - https://www.dns-shop.ru/catalog/17a8a01d16404e77/smartfony/?p=2
Во-вторых, если вышенаписанное верно, то вероятно вам и Selenium не особо нужен, по крайней мере в парсинге этого конкретного сайта (но это не точно, предположение). Для получения статического HTML лучше, быстрее и надёжнее справится, например, библиотека requests.
selenium не понимает когда ему дают несколько классов 'pagination-widget__page-link pagination-widget__page-link_next '), возьмите один "pagination-widget__page-link_next"
driver = Chrome('C:\\......\chromedriver.exe')
driver.implicitly_wait(10)
driver.get('https://www.dns-shop.ru/catalog/17a9f3da16404e77/pulty-du-dlya-televizorov/') # Запускаем браузер
# Находим кнопку перехода на следующую страницу
but_end= driver.find_element(By.CLASS_NAME, "pagination-widget__page-link_next")
but_end.click() # Жмем ее