Введение в парсинг веб-страниц с помощью Python

Одна из замечательных особенностей Python заключается в том, насколько просто можно выполнять довольно сложные и впечатляющие задачи. Отличным примером этого является парсинг веб-страниц.

Это статья о парсинге веб-страниц с помощью Python. В нем мы рассмотрим основы парсинга веб-страниц с использованием популярных библиотек, таких как requests а также beautiful soup.

Темы охватывали:

  • Что такое веб-скрапинг?
  • Что requests а также beautiful soup?
  • Использование селекторов CSS для таргетинга данных на веб-странице
  • Получение данных о продукте с сайта демо-книги
  • Хранение очищенных данных в форматах CSV и JSON

Что такое веб-скрейпинг?

Некоторые веб-сайты могут содержать большое количество ценных данных. Веб-скрапинг означает извлечение данных с веб-сайтов, как правило, в автоматическом режиме с использованием бота или поискового робота. Доступные виды или данные столь же широки, как и сам Интернет. Общие задачи включают

  • анализ цен на акции для обоснования инвестиционных решений
  • автоматическая загрузка файлов, размещенных на веб-сайтах
  • парсинг данных о контактах компании
  • извлечение данных из локатора магазинов для создания списка местоположений предприятий
  • сбор данных о товарах с таких сайтов, как Amazon или eBay
  • сбор спортивной статистики для ставок
  • сбор данных для генерации лидов
  • сопоставление данных, доступных из нескольких источников

Законность парсинга веб-страниц

В прошлом существовала некоторая путаница в отношении законности извлечения данных с общедоступных веб-сайтов. Это было прояснено недавно (я пишу в июле 2020 года) в ходе судебного разбирательства, когда Апелляционный суд США отклонил просьбы LinkedIn о запрете аналитической компании HiQ очищать свои данные.

Это решение стало историческим моментом в эпоху конфиденциальности и регулирования данных. Он показал, что любые общедоступные данные, не защищенные авторскими правами, потенциально являются хорошей добычей для поисковых роботов.

Однако, действовать с осторожностью. Вы всегда должны чтить условия и положения сайта, с которого вы хотите получить данные, а также содержимое его robots.txt файл. Вы также должны убедиться, что любые данные, которые вы очищаете, используются законным образом. Например, вам следует рассмотреть вопросы авторского права и законы о защите данных, такие как GDPR. Кроме того, имейте в виду, что решение высшего суда может быть отменено, и могут применяться другие законы. Эта статья не предназначена для предоставления юридических консультаций, поэтому, пожалуйста, проведите собственное исследование по этой теме. Одним из мест для начала является Quora. Там есть несколько хороших и подробных вопросов и ответов, таких как по этой ссылке

Один из способов избежать любых потенциальных юридических проблем при изучении того, как использовать Python для сбора данных с веб-сайтов, — это использовать сайты, которые либо приветствуют, либо терпят вашу активность. Отличное место для начала царапать — песочница для парсинга веб-страниц, которую мы будем использовать в этой статье.

Пример парсинга веб-страниц в Python

Вам нужно будет установить две общие библиотеки парсинга, чтобы использовать следующий код. Это можно сделать с помощью

pip install requests

а также

pip install beautifulsoup4

в командной строке. Подробнее о том, как устанавливать пакеты в Python, см. Установка пакетов Python с помощью Pip.

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

Давайте посмотрим на пример:

import csv
import json
import requests
from requests.exceptions import ConnectionError
from bs4 import BeautifulSoup

if __name__ == " __main__":

    url = "

    try:
        request = requests.get(url)
        soup = BeautifulSoup(request.text, "html.parser")
        products = soup.find_all(class_="product_pod")
        data = []
        for product in products:
            title = product.find("h3").text
            price = float(product.find("div", class_="product_price").find("p", class_="price_color").text.strip("£"))
            data.append((title, price))
        store_as_csv(data, headings=["title", "price"])
        store_as_json(data)
        print("### RESULTS ###")
        for item in data:
            print(*item) # Don't let this phase you - it just unpacks the tuples for nicer display.
    except ConnectionError:
        print("Unable to open url.")

Так как же работает код?

Чтобы иметь возможность выполнять веб-скрапинг с помощью Python, вам потребуется базовое понимание HTML а также CSS. Это делается для того, чтобы вы понимали территорию, на которой работаете. Вам не нужно быть экспертом, но вам нужно знать, как перемещаться по элементам на веб-странице с помощью инспектора, такого как инструменты разработчика хром. Если у вас нет этих базовых знаний, вы можете пойти и получить их (w3schools это отличное место для начала), или, если вы чувствуете себя смелым, просто попробуйте следовать за вами и подобрать то, что вам нужно, по ходу дела.

Чтобы увидеть, что происходит в приведенном выше коде, перейдите к http://books.toscrape.com/. Наведите курсор на цену книги, щелкните правой кнопкой мыши и выберите «проверить» (это опция в Chrome — она может немного отличаться от «проверить элемент» в других браузерах. Когда вы это сделаете, появится новая область). показывая вам HTML, который создал страницу. Вы должны обратить особое внимание на атрибуты «класса» элементов, на которые вы хотите настроить таргетинг.

В нашем коде есть

products = soup.find_all(class_="product_pod")

Это использует атрибут класса и возвращает список элементов с классом product_pod.

Тогда для каждого из этих элементов имеем:

title = product.find("h3").text
price = float(product.find("div", class_="product_price").find("p", class_="price_color").text.strip("£"))

Первая строка довольно проста и просто выбирает текст h3 элемент для текущего продукта. Следующая строка делает много вещей и может быть разбита на отдельные строки. В основном он находит p тег с классом price_color внутри div тег с классом product_price, извлекает текст, удаляет знак фунта и, наконец, преобразует его в число с плавающей запятой. Этот последний шаг не является строго обязательным, так как мы будем хранить наши данные в текстовом формате, но я включил его на тот случай, если вам понадобится действительный числовой тип данных в ваших собственных проектах.

Хранение очищенных данных в формате CSV

csv (значения, разделенные запятыми) — очень распространенный и полезный формат файла для хранения данных. Он легкий и не требует базы данных.

Добавьте этот код над if __name__ == " __main__": линия

def store_as_csv(data, headings=None): # Don't use headings=[] as default argument. It behaves weirdly. if headings is None: headings = []

    with open("data.csv", "w", encoding="utf-8", newline="") as file:
        writer = csv.writer(file)

        # write title row
        writer.writerow(headings)

        # Write data
        for item in data:
            writer.writerow(item)

и прямо перед строкой print("### RESULTS ###")Добавь это:

store_as_csv(data, headings=["title", "price"])

Когда вы сейчас запустите код, будет создан файл, содержащий данные вашей книги в формате csv. Довольно аккуратно, да?

title,price
A Light in the ...,51.77
Tipping the Velvet,53.74
Soumission,50.1
Sharp Objects,47.82
Sapiens: A Brief History ...,54.23
...

Хранение очищенных данных в формате JSON

Другим очень распространенным форматом для хранения данных является JSON (Обозначение объектов JavaScript), которое в основном представляет собой набор списков и словарей (называемых массивами и объектами в JavaScript).

Добавьте этот дополнительный код выше if __name__...:

def store_as_json(data):
    # List to store dictionaries containing the data we extracted.
    records = []
    for item in data:
        new_record = {
            "title": item[0],
            "price": item[1]
        }
        records.append(new_record)
    # Write these to a JSON file.
    with open('data.json', 'w') as outfile:
        json.dump(records, outfile, indent=4)

а также store_as_json(data) над print("### Results ###") линия.

[
    {
        "title": "A Light in the ...",
        "price": 51.77
    },
    {
        "title": "Tipping the Velvet",
        "price": 53.74
    },
    {
        "title": "Soumission",
        "price": 50.1
    },
    {
        "title": "Sharp Objects",
        "price": 47.82
    },
    ...
]

Итак, у вас есть это — теперь вы знаете, как собирать данные с веб-страницы, и для этого не потребовалось много строк кода Python!

Полный листинг кода для примера веб-скрейпинга Python

Вот полный список нашей программы для вашего удобства.

import csv
import json
import requests
from requests.exceptions import ConnectionError
from bs4 import BeautifulSoup

def store_as_csv(data, headings=None): # Don't use headings=[] as default argument. It behaves weirdly.
    if headings is None:
        headings = []

    with open("data.csv", "w", encoding="utf-8", newline="") as file:
        writer = csv.writer(file)

        # write title row
        writer.writerow(headings)

        # Write data
        for item in data:
            writer.writerow(item)

def store_as_json(data):
    # List to store dictionaries containing the data we extracted.
    records = []
    for item in data:
        new_record = {
            "title": item[0],
            "price": item[1]
        }
        records.append(new_record)
    # Write these to a JSON file.
    with open('data.json', 'w') as outfile:
        json.dump(records, outfile, indent=4)

if __name__ == " __main__":

    url = "

    try:
        request = requests.get(url)
        soup = BeautifulSoup(request.text, "html.parser")
        products = soup.find_all(class_="product_pod")
        data = []
        for product in products:
            title = product.find("h3").text
            price = float(product.find("div", class_="product_price").find("p", class_="price_color").text.strip("£"))
            data.append((title, price))
        store_as_csv(data, headings=["title", "price"])
        store_as_json(data)
        print("### RESULTS ###")
        for item in data:
            print(*item) # Don't let this phase you - it just unpacks the tuples for nicer display.
    except ConnectionError:
        print("Unable to open url.")

Последнее замечание. мы использовали requests а также beautifulsoup для нашего парсинга, и большая часть существующего кода в Интернете в статьях и репозиториях использует эти библиотеки. Тем не менее, есть более новая библиотека, которая выполняет задачу обеих этих вместе взятых и имеет некоторые дополнительные функции, которые могут оказаться полезными позже. Эта новая библиотека requests-HTML и на него стоит обратить внимание, как только вы получите общее представление о том, чего вы пытаетесь достичь с помощью парсинга веб-страниц. Другая библиотека, которая часто используется для более сложных проектов, охватывающих несколько страниц, это scrapyно это вообще более сложный зверь, для атер статьи.

Работа с содержимым этой статьи даст вам твердое представление об основах парсинга веб-страниц в Python. Я надеюсь, что вы найдете это полезным

Удачных вычислений.

Этот пост изначально был опубликован на Блог компьютерной академии.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *