CoderCastrov logo
CoderCastrov
Парсер

Парсинг с использованием Python - Руководство - Статические веб-страницы

Парсинг с использованием Python - Руководство - Статические веб-страницы
просмотров
5 мин чтение
#Парсер


I. Несколько определений:

1-Парсинг

2-Статическая веб-страница

3-Динамическая веб-страница

II. Парсинг статической веб-страницы

1-Изучение целевых данных в исходном коде

2-Получение только интересующих нас данных

3-Автоматизация парсинга на нескольких страницах


I. Несколько определений

1-Что такое парсинг?

В двух словах, это процесс извлечения целевых данных с одной или нескольких веб-страниц.

Пример: Извлечение всех заголовков статей с главной страницы Figaro.

2-Определение статической веб-страницы

Статическая веб-страница - это просто веб-страница, которая отображает весь свой контент непосредственно: нет ссылок на скрытую часть веб-страницы, нет элементов, на которые можно нажать, чтобы отобразить скрытую часть страницы.

В основном, это веб-страница, которая не меняется или не имеет возможности взаимодействия. Пример:

3-Определение динамической веб-страницы

В отличие от статической веб-страницы, динамическая веб-страница содержит "скрытую" информацию, то есть содержимое страницы может изменяться в зависимости от пользователя, например, при нажатии на ссылку.

Пример: Поиск в Google, предлагающий несколько вариантов, является динамической веб-страницей.

Мы видим, что содержимое веб-страницы будет изменяться при нажатии на одну из предложенных страниц Google.

Почти все веб-страницы сегодня являются динамическими.

II. Парсинг статической веб-страницы

PS: Ноутбук доступен на моем Github по этой ссылке.

Для этого примера я выберу веб-страницу, на которой представлена статическая таблица данных. (Сама страница содержит ссылки, поэтому она динамическая, но данные, которые нас интересуют, являются "статическими", поэтому методика одинакова.)

На этом сайте представлены имена, которые были даны детям и их частота во Франции в 2019 году.

Мы собираемся автоматически извлечь все эти данные в таблицу.

Если прокрутить вниз, можно заметить, что есть несколько страниц с именами:

Когда мы нажимаем на следующую страницу, URL-адрес страницы изменяется, и появляется номер страницы рейтинга:

На каждой странице рейтинга данные всегда организованы одинаково: имена/частоты находятся в таблице прямо под заголовком "Самые популярные имена во Франции".

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

1-Изучение целевых данных в исходном коде

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

Затем вы увидите, что исходный код отображается справа:

Все информация веб-страницы находится в ее исходном коде. Но нам не нужно все это получать! Нам нужна только таблица с именами/вхождениями.

2-Извлечение только нужных данных

Для получения данных с веб-страницы мы будем использовать библиотеку requests, которая будет делать HTTP-запросы к указанному URL.

Для извлечения только нужных данных мы будем использовать библиотеку Python: BeautyfulSoup, которая поможет нам отсортировать информацию.

Мы будем хранить данные в dataframe, очень полезную для работы с данными. Для этого нам понадобится библиотека pandas.

Установка

pip install bs4
pip install requests
pip install pandas

Импорт

from bs4 import BeautifulSoup
import requests
import pandas as pd

Сначала мы получаем "сырую" веб-страницу в переменной r, сделав HTTP-запрос GET по URL:

url = "[https://www.journaldesfemmes.fr/prenoms/classement/prenoms/les-plus-donnes](https://www.journaldesfemmes.fr/prenoms/classement/prenoms/les-plus-donnes)"
r = requests.get(url)

Затем мы преобразуем сырой HTML-код в синтаксическое дерево (супу), чтобы извлечь нужную информацию.

soup = BeautifulSoup(r.text, 'lxml')

Отлично, у нас теперь есть все отсортированные данные с веб-страницы.

Мы можем насладиться красотой супа, выведя:

print(soup.prettify())

Затем мы ищем все значения, которые мы будем вводить в нашу таблицу:

Поиск данных на веб-странице

  • Отобразите исходный код (fn + F12)
  • Выберите инспектор элементов (Ctrl + Shift + c) или нажмите:
  • Нажмите на первое имя в рейтинге ➡ затем исходный код покажет вам соответствующее место имени в синтаксическом дереве. Выберите маленькие черные стрелки, и вы должны увидеть имя, его частоту ниже и рейтинг выше:
  • Обратите внимание, что информация хранится в теге <td>, а затем в теге <tr> и что на странице есть столько имен, сколько тегов "<tr>...</tr>" ➡ Для каждого тега <tr> у нас есть информация об одной строке рейтинга.

Извлечение целевых данных из HTML-кода

Мы будем искать все теги <tr>/<td> в нашем супе, чтобы получить только данные из таблицы.

Чтобы убедиться, что мы получим нужные данные, вы можете выполнить следующий код:

for i in soup.find_all("tr")[1:]:
    print(i.find_all("td"))

У нас есть все нужные данные! Просто избегайте брать первую пустую строку.

Но перед этим мы создадим фрейм данных, чтобы сохранить наши данные.

columns_names = ["Ранг", "Имя", "Рождения в 2019 году"]
df = pd.DataFrame(columns = columns_names)

Отлично, теперь все готово! Мы просто собираем наши данные и добавляем их по мере необходимости в нашу таблицу df.

for i in soup.find_all("tr")[1:]:
    
    # Ищем ранг i-го имени
    rank = i.find_all("td")[0].text
    # Ищем i-е имя ....
    name = i.find_all("td")[1].text
    # i-е вхождение
    occurence = i.find_all("td")[2].text    # Добавляем построчно в фрейм данных
    df = df.append({'Ранг': rank, 'Имя': name, 'Рождения в 2019 году': occurence}, ignore_index=True)

Проверьте, что первые 5 строк правильные:

print(df.head())

И вот, мы только что спарсили веб-страницу :)

Резюме

Мы только что спарсили одну страницу, но их есть еще несколько:

3-Автоматизация парсинга на нескольких страницах

Как мы видели ранее, структура страницы не меняется. Вы можете проверить это, выполнив поиск имени на любой другой странице с помощью инспектора элементов и заметить, что имя находится в теге <tr>/<td>.

Поэтому мы можем автоматизировать парсинг, выполняя цикл по номеру страницы.

На этот раз мы будем использовать URL, содержащий номер страницы, как объяснено выше.

url = "https://www.journaldesfemmes.fr/prenoms/classement/prenoms/les-plus-donnes?page="

Единственное отличие от части 1 заключается в том, что мы будем итерировать по номеру страницы, начиная с 1, и проверять, меняется ли значение имени на каждой итерации.

numero_page = 1
prenom_0 = "Имя по умолчанию"
prenom = ""
while prenom_0 != prenom:
    prenom = prenom_0
    print("Мы будем парсить эту веб-страницу: " + url + str(numero_page))
    try:
        r = requests.get(url + str(numero_page))
        soup = BeautifulSoup(r.text, 'lxml')
        for i in soup.find_all("tr")[1:]:
            rang = i.find_all("td")[0].text
            prenom = i.find_all("td")[1].text
            occurence = i.find_all("td")[2].text
            df = df.append({'Ранг': rang, 'Имя': prenom, 'Рождения в 2018 году': occurence}, ignore_index=True)
            
        numero_page += 1
        
    except:
        print("Ошибка при парсинге")
        break

Вывод датафрейма выглядит следующим образом:

Вы можете найти блокнот этого туториала для скачивания и попробовать его на своей машине!

☀️☀️☀️☀️Продолжайте в том же духе!☀️☀️☀️☀️


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