Автор оригинала: 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. Я надеюсь, что вы найдете это полезным
Счастливые вычисления.
Этот пост был первоначально опубликован на сайте Блог академии Компу .