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

Введение в сеть соскабливание с Python

Это статья о сетевом соскобе с Python. В нем мы рассмотрим основы Web Scraping с использованием библиотек, таких как запросы и красивый суп.

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

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

Это статья о сетевом соскобе с Python. В нем мы рассмотрим основы SEB SCRAPING, используя популярные библиотеки, такие как Запросы и Красивый суп Отказ

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

  • Что такое Scraping Web?
  • Что такое Запросы и Красивый суп ?
  • Использование селекторов CSS к целевым данным на веб-странице
  • Получение данных продукта из демонстрационного сайта
  • Хранение SCRAPED DATA в форматах CSV и JSON

Что такое Scraping Web?

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

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

Законность веб-соскоба

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

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

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

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

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

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

PIP Установка запросов

а также

PIP Установить BeautifulSoup4.

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

Запросы Библиотека обрабатывает соединение и получение данных с вашей целевой веб-страницы, в то время как 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/ Отказ Поместите курсор по цене книги, щелкните правой кнопкой мыши и выберите «Проверьте» (это опция на 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 (Значения разделенные запятыми) – это очень распространенный и полезный формат файла для хранения данных. Это легкий и не требует базы данных.

Добавьте этот код выше Если __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)

И незадолго до линии Печать ("### Результаты ###") , Добавь это:

Store_as_csv (данные, заголовки = [«Название», «Цена»])

Когда вы запускаете код теперь, файл будет создан, содержащий данные вашей книги в формате 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
...

Хранение SCRAPED DATA в формате JSON

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

Добавьте этот дополнительный код выше Если __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 (данные) выше Печать ("### Результаты ###") линия.

[
    {
        "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 для достижения!

Полный список кода для примера Scropping Python Web

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

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.")

Одна последняя записка. Мы использовали Запросы и Beautifulsoup Для нашего соскабливания, и многие существующие код в Интернете в статьях и репозиториях используются эти библиотеки. Тем не менее, существует более новая библиотека, которая выполняет задачу обоих из них, и имеет некоторые дополнительные функции, которые вы можете найти полезны позже. Эта новая библиотека – Запросы-HTML И стоит посмотреть, как только у вас есть базовое понимание того, что вы пытаетесь достичь с веб-соскабливанием. Другая библиотека, которая часто используется для более продвинутых проектов, охватывает несколько страниц Снапировка , но это более сложный зверь в целом, для более поздней статьи.

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

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