Парсинг сайта с помощью Селениум

Рейтинг: 1Ответов: 2Опубликовано: 29.01.2023

Подскажите пожалуйста, всю голову сломала. Нужно распарсить сайт с помощью Селениум. Не получается указать, что нужно кликать на кнопку, чтобы переходил на следующую страницу. Не могу правильно подобрать путь к нему и правильно указать.

Вот код:

data = []

browser = Chrome(r"C:\Users\julij\Desktop\chromedriver")

url = 'https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast'
browser.get(url)

sleep(3)

for p in range(837):
    print(p)

    soup = BeautifulSoup(browser.page_source, 'lxml')

    orgs = soup.findAll('div', class_='tr tbody-tr')

    for org in orgs:
        name = soup.find('div', class_='tr tbody-tr').text.strip().replace("\n",";").replace("\xa0"," ")
        data.append([name])

print(len(data))


but = browser.find_element('PagedList-skipToNext').a
but.click()
    
sleep(10)

Проблема именно здесь:

but = browser.find_element('PagedList-skipToNext').a
but.click()

Вот сам сайт: https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast?page=3

А вот код элемента:

<a href="contragent/by-region/volgogradskaya-oblast?page=4" rel="next">&gt;</a>

лежит он в классе

<li class="PagedList-skipToNext"><a href="contragent/by-region/volgogradskaya-oblast?page=4" rel="next">&gt;</a></li>

Ответы

▲ 3

Можно найти нужный элемент через CSS селектор, предварительно импортировав from selenium.webdriver.common.by import By:

but = browser.find_element(By.CSS_SELECTOR,'.PagedList-skipToNext a') # выбрать первый тэг a внутри элемента с классом PagedList-skipToNext
▲ 1

Ваш код немного поправил

name = org.text.strip().replace("\n",";").replace("\xa0"," ")

Парсили бы через BeautifulSoup всего то нужно получить ссылку на следующую страницу, а имея ссылку вы уже знаете что с ней можно сделать.(browser.get(url))

print(f"https://www.1cont.ru/{soup.find(attrs={'rel': 'next'}).get('href')}")
# https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast?page=2

Другой вариант скакания по страницам (пагинация):

for page in range(1, 4):
    url = f'https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast?page={page}'
    print(url)
# https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast?page=1
# https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast?page=2
# https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast?page=3

Да и без селенимум можно справиться с помощью BeautifulSoup + requests (парсинг происходит быстрее по сравнению c селенимум). В итоге можно получить примерно такой код.

import requests
from bs4 import BeautifulSoup

page = 1
while True:
    url = f'https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast?page={page}'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # ваш код

    if not soup.find(attrs={'rel': 'next'}): # На последнее странице нет кнопки ">"
        break                                # разь два, три четыре, закончили упражнение
    print(url)
    page += 1

Корзина.(жалко выкидывать)

import pandas as pd

response = requests.get('https://www.1cont.ru/contragent/by-region/volgogradskaya-oblast')
soup = BeautifulSoup(response.text, 'lxml')
orgs = soup.findAll(class_='tbody-tr')
lst = []
vvv = ['Статус организации', 'Город', 'Адрес', 'ОГРН', 'ИНН',
       'Уставный капитал', 'ОКВЭД', 'Дата регистрации']
for org in orgs:
    dct = {}
    name, *tdes = org.findAll(class_='td')
    dct.update({'Организация': name.text.strip()})

    for td in tdes:
        key, value = td.stripped_strings
        key = key.replace('\xa0', ' ').replace(':', '')
        if not key in vvv:
            value = f"{key} {value}"
            key = 'Boss'
        dct.update({key: value})
    lst.append(dct)
# print(lst)
# pd.options.display.max_columns = None
pd.options.display.max_rows = None
df = pd.DataFrame(lst)
# df.to_csv('aaa.csv')
print(df[['Организация', 'Boss']])

что можно сделать еще, например 'Директор МУРЗАХАНОВ ЭДУАРД ВАСЫЛОВИЧ' -> {'Должность': 'Директор', 'ФИО': 'МУРЗАХАНОВ ЭДУАРД ВАСЫЛОВИЧ'} 'ИП ТИХОНОВ ВИКТОР ЕВГЕНЬЕВИЧ' -> {'Должность': 'Предпринима́тель', 'ФИО': 'ТИХОНОВ ВИКТОР ЕВГЕНЬЕВИЧ'}