CoderCastrov logo
CoderCastrov
Анализ данных

Парсинг данных из вложенных HTML-страниц с помощью Selenium в Python

Парсинг данных из вложенных HTML-страниц с помощью Selenium в Python
просмотров
4 мин чтение
#Анализ данных

Сбор данных

Краткое руководство по созданию списка терминов, извлеченных из веб-сайта

Парсинг предполагает извлечение информации из HTML-страниц, доступных в Интернете. В Python парсинг может быть выполнен с помощью библиотеки Selenium.

В этом руководстве я покажу, как с помощью Python и selenium извлечь список терминов, распределенных на двух уровнях вложенных страниц. В качестве примера я извлеку список терминов с сайта Bocardi.

Полный код этого руководства можно скачать с моего репозитория на Github.

Установка

Библиотека selenium может быть легко установлена с помощью pip с помощью команды pip install selenium. В дополнение к библиотеке, мне также нужно установить драйвер для моего браузера, который зависит от версии моего браузера. В этом руководстве я использую браузер Chrome. Я могу проверить его версию, введя chrome://settings/help в адресной строке моего браузера.

Image by Author

В моем случае версия 80, поэтому я могу скачать драйвер Chrome по этой ссылке. После загрузки я могу поместить файл в общую папку файловой системы и мне нужно настроить переменную $PATH с путем к драйверу Chrome:

  • Пользователи Windows - в этом видео я объясняю, как установить драйвер Chrome для selenium в Windows 10.
  • Mac OS/ Linux - отредактируйте файл .bash_profile или .profile, добавив следующую строку export PATH="<путь к веб-драйверу>:$PATH", а затем перезагрузите компьютер.

Распознавание структуры веб-сайта

Для того чтобы провести парсинг данных с веб-сайта, сначала мне необходимо изучить структуру URI. В моем примере список терминов организован в алфавитном порядке, и для каждой буквы алфавита есть отдельная страница, доступная по адресу <basic_url>/dizionario/<current_letter>/ (первый уровень URI). Например, для буквы a соответствующая страница доступна по адресу https://www.brocardi.it/dizionario/a/. Кроме того, список терминов для каждой буквы разбит на несколько страниц. Для каждой буквы первая страница доступна на первом уровне URI, а начиная со второй страницы URI меняется и доступен по адресу <basic_url>/dizionario/<current_letter>/?page=<page_number>. Например, для буквы a список терминов на второй странице доступен по ссылке [https://www.brocardi.it/dizionario/a/?page=2](https://www.brocardi.it/dizionario/a/?page=2.).

Настройка окружения

В моем коде мне нужно реализовать два цикла: внешний цикл для букв и внутренний цикл для страниц. Я замечаю, что некоторые буквы отсутствуют (жкшэю). Для внешнего цикла я создаю список, содержащий все буквы, кроме отсутствующих. Я использую string.ascii_lowercase, чтобы создать список букв.

import string
letters = string.ascii_lowercase
letters = letters.replace('жк', '')
letters = letters.replace('шэю', '')
letters = list(letters)

Затем я определяю две переменные: basic_url, которая содержит базовый URL веб-сайта, и table, которая будет содержать список всех извлеченных терминов. Изначально table является пустым списком.

table = []
basic_url = "[https://www.brocardi.it](https://www.brocardi.it)"

Теперь я импортирую все драйверы selenium и исключение NoSuchElementException, которое будет использоваться для перехвата некоторых видов исключений при выполнении внутреннего цикла. Я также импортирую библиотеку pandas.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options  
from selenium.common.exceptions import NoSuchElementException

Вложенные циклы

Я реализую внешний цикл с помощью for, охватывающий диапазон от a до z. На каждом шаге внешнего цикла я создаю URL-адрес. Затем я реализую внутренний бесконечный цикл с помощью while. Внутри внутреннего цикла я создаю драйвер, который выполняет парсинг. Я использую драйвер Chrome(), который принимает в качестве входных параметров опции --headless и --lang=it. Первая опция указывает, что браузер не будет открыт, а вторая опция указывает язык браузера.

После подключения я ищу два элемента:

  • элементы, содержащие список терминов
  • элемент, содержащий ссылку на следующую страницу.

Оба элемента зависят от структуры HTML-страницы. Я использую функцию find_elements_by_xpath(), чтобы найти определенный XPath.

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

for letter in letters:
    
    url = basic_url + '/dizionario/' + letter + '/'
    while True:
        try:
            print(url)
            options = Options()  
            options.add_argument("--headless") 
            options.add_argument("--lang=it");
            driver = webdriver.Chrome(options=options)driver.get(url)# получить список терминов
            xpath = '//ul[[@class](http://twitter.com/class)="terms-list"]'
            words = driver.find_element_by_xpath(xpath).text
            table.extend(words.split('\n'))
            
            # получить следующую страницу
            xpath = '//a[[@class](http://twitter.com/class)="next"]'
            url = driver.find_element_by_xpath(xpath).get_attribute('href')
            
            driver.close()
        
        except NoSuchElementException:
            break

Сохранение результатов

Переменная table содержит список всех терминов. Я могу сохранить его в CSV-файл. Для этого можно создать объект pandas Dataframe.

import pandas as pd
df = pd.DataFrame(table, columns=['слово'])
df['слово'] = df['слово'].str.lower()
df.to_csv('outputs/glossary.csv')

Сводка

В этом руководстве я показал, как установить и использовать Python selenium для извлечения данных из вложенных HTML-страниц.

После установки и настройки библиотеки требуется выполнить три шага:

  • распознать структуру веб-сайта
  • реализовать два уровня циклов и извлечь данные и ссылку на следующую страницу
  • сохранить данные в объекте pandas dataframe.

Если вы хотите быть в курсе моих исследований и других активностей, вы можете следить за мной в Twitter, Youtube и Github.

Связанные статьи

Как извлечь таблицы из PDF с помощью Python Pandas и tabula-py

Быстрый и готовый скрипт для извлечения повторяющихся таблиц из PDF

towardsdatascience.com

Как создать набор данных из Twitter с использованием Python tweepy

Быстрый учебник и готовый скрипт для извлечения твитов

towardsdatascience.com