Парсинг сайтов через питон модулем selenium

Работа идет через модуль selenium, для него нужно скачать Chrome driver и браузер Chrome.
Важно чтобы версия браузера и Chrome driver была одна и та же

Версию браузера смотрим Справка → О браузере, и сверяемся с версией хром драйвер.

Чтобы точно быть уверенным, что все работает установите библиотеку selenium, импортируйте ее и запустите браузер через хром драйвер.

pip install selenium
from selenium.webdriver import Chrome
browser = Chrome ("d:\del\chromedriver_win32\chromedriver.exe")
Если все корректно, запускается хром в режиме: «Браузером управляет тестовое ПО»

В тестовом браузере будут выполнятся все команды.

Импортируем необходимые библиотеки

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from bs4 import BeautifulSoup
from time import sleep

Переход на сайт

url = "https://bus.gov.ru/registry"
browser.get(url)
В тестовом браузере открылся сайт https://bus.gov.ru/registry

Нужно ввести в строке поиска «онкологический диспансер»

Способ 1

input_el = browser.find_element_by_tag_name("input")
input_el.send_keys("онкологический диспансер")
Вводится наименование в поле input

Нажать энтер или кнопку найти.

Нажатие кнопки энтер:

input_el.send_keys(Keys.ENTER)

Нажатие кнопки найти:

browser.find_element_by_xpath("/html/body/div[2]/ui-view/form/div[2]/div/div[2]/div/button").click()
После выполнения кода браузер ищет диспансеры

Дальше работаем как при простом парсинге сайта

soup = BeautifulSoup(browser.page_source, "lxml")
soup
В переменной soup вся текущая страница

Смотрим где содержится название учреждения и ссылка на него

soup.find ("a", class_="result__button").get("href")
soup.find("a",class_="result__title").text
Для получения части ссылки используем запрос get, для названия text

Чтобы не искать по всей странице, можно оставить информацию которая нам нужна, она содержится к контейнере c классом results

orgs=soup.findAll("div",class_="result")
orgs
Содержимое всех контейнеров result

Обработка текущей страницы

data = []
for el in orgs:
    name = el.find("a", class_="result__title").text
    link = "https://bus.gov.ru/registry" + el.find("a", class_="result__button").get("href")
    #print (name, link)
    data.append([name,link])
data
Названия учреждений и ссылка на страницу с описанием

Нужно нажимать на страницу «следующая»

next_button = browser.find_element_by_class_name("pagination__next")
next_button.click()

Код нажимает на элемент с классом pagination__next

Готовый код для сбора всей информации

url = 'https://bus.gov.ru/registry'
browser.get(url)
sleep(5)
input_el = browser.find_element_by_tag_name('input')
input_el.send_keys('онкологический диспансер')
input_el.send_keys(Keys.ENTER)
sleep(5)

data = []


for i in range(10):
    
    soup = BeautifulSoup(browser.page_source, "lxml")
    orgs = soup.findAll('div', class_='result')
    
    for el in orgs:
        name = el.find('a', class_='result__title').text
        link = "https://bus.gov.ru"+el.find('a', class_='result__button').get('href')
        print(name, link)
        

        data.append([name, link])
        
    print(len(data))
    try:
        next_button = browser.find_element_by_class_name('pagination__next')
        next_button.click()
    except NoSuchElementException:
        continue
    sleep(6)
Все данные попадают в таблицу data, в ней столбец с наименованием и ссылка
Подробный вебинар про модуль selenium, используется среда разработки Анаконда с модулем Юпитер. Во второй части парсится сайт с судебными решениями.
Отправить
Поделиться
Твитнуть
Запинить

Считаю метрики, делаю сквозную аналитику и когортный анализ, составляю интерактивные дешборды, моделирую юнит-экономику


Обратиться с задачей