Парсинг сайта с помощью Селениум
Подскажите пожалуйста, всю голову сломала. Нужно распарсить сайт с помощью Селениум. Не получается указать, что нужно кликать на кнопку, чтобы переходил на следующую страницу. Не могу правильно подобрать путь к нему и правильно указать.
Вот код:
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">></a>
лежит он в классе
<li class="PagedList-skipToNext"><a href="contragent/by-region/volgogradskaya-oblast?page=4" rel="next">></a></li>
Ответы (2 шт):
Ваш код немного поправил
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']])
что можно сделать еще, например 'Директор МУРЗАХАНОВ ЭДУАРД ВАСЫЛОВИЧ' -> {'Должность': 'Директор', 'ФИО': 'МУРЗАХАНОВ ЭДУАРД ВАСЫЛОВИЧ'} 'ИП ТИХОНОВ ВИКТОР ЕВГЕНЬЕВИЧ' -> {'Должность': 'Предпринима́тель', 'ФИО': 'ТИХОНОВ ВИКТОР ЕВГЕНЬЕВИЧ'}
Можно найти нужный элемент через CSS селектор, предварительно импортировав from selenium.webdriver.common.by import By:
but = browser.find_element(By.CSS_SELECTOR,'.PagedList-skipToNext a') # выбрать первый тэг a внутри элемента с классом PagedList-skipToNext