Парсинг данных из вложенных HTML-страниц с помощью Selenium в Python
Table Of Content
- Сбор данных
- Краткое руководство по созданию списка терминов, извлеченных из веб-сайта
- Установка
- Распознавание структуры веб-сайта
- Настройка окружения
- Вложенные циклы
- Сохранение результатов
- Сводка
- Связанные статьи
- Как извлечь таблицы из PDF с помощью Python Pandas и tabula-py
- Быстрый и готовый скрипт для извлечения повторяющихся таблиц из PDF
- Как создать набор данных из Twitter с использованием Python tweepy
- Быстрый учебник и готовый скрипт для извлечения твитов
Сбор данных
Краткое руководство по созданию списка терминов, извлеченных из веб-сайта
Парсинг предполагает извлечение информации из HTML-страниц, доступных в Интернете. В Python парсинг может быть выполнен с помощью библиотеки Selenium.
В этом руководстве я покажу, как с помощью Python и selenium
извлечь список терминов, распределенных на двух уровнях вложенных страниц. В качестве примера я извлеку список терминов с сайта Bocardi.
Полный код этого руководства можно скачать с моего репозитория на Github.
Установка
Библиотека selenium
может быть легко установлена с помощью pip
с помощью команды pip install selenium
. В дополнение к библиотеке, мне также нужно установить драйвер для моего браузера, который зависит от версии моего браузера. В этом руководстве я использую браузер Chrome. Я могу проверить его версию, введя chrome://settings/help
в адресной строке моего браузера.
В моем случае версия 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