Рубрики
Без рубрики

Введение в веб-скребок с помощью Python

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

Автор оригинала: Robin Andrews.

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

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

Затронутые темы:

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

Что такое Соскабливание паутины?

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

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

Законность соскабливания паутины

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

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

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

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

Пример веб-скребка в Python

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

запросы на установку pip

и

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 = "http://books.toscrape.com/"

    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 . Это для того, чтобы вы понимали территорию, на которой работаете. Вам не нужно быть экспертом, но вам нужно знать, как перемещаться по элементам веб-страницы с помощью инспектора, такого как chrome dev tools . Если у вас нет этих базовых знаний, вы можете пойти и получить их ( w3schools – отличное место для начала), или если вы чувствуете себя храбрым, просто попробуйте следовать за ними и подбирать то, что вам нужно, по ходу дела.

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

В нашем коде мы имеем

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

При этом используется атрибут class и возвращается список элементов с классом 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 , извлекает текст , удаляет знак фунта и, наконец, преобразует его в float. Этот последний шаг не является строго необходимым, поскольку мы будем хранить наши данные в текстовом формате, но я включил его на случай, если вам понадобится фактический числовой тип данных в ваших собственных проектах.

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

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

Добавьте этот код над строкой if __name__:

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 Object Notation), который в основном представляет собой набор списков и словарей (называемых массивами и объектами в 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 = "http://books.toscrape.com/"

    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 , но это более сложный зверь в целом, для статьи ater.

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

Счастливые вычисления.

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