Парсинг веб-страниц с помощью Python
Как спарсить данные с веб-сайта и сохранить их в CSV
Парсинг веб-страниц - это процесс сбора информации из интернета.
Примечание: Если вы парсите страницу, которая доступна в Интернете только в образовательных целях, то, кажется, это нормально. Но все же рекомендуется проверить их Условия использования, так как некоторым веб-сайтам не нравится, когда автоматические парсеры собирают их данные, в то время как другие не против.
Давайте рассмотрим простой пример, где это может быть полезно. Предположим, вы хотите купить популярный товар с веб-сайта, который всегда быстро распродается. Один из способов - посетить веб-сайт, применить фильтры, проверять наличие товара каждый день.
Для этого вам придется тратить несколько минут каждый день, чтобы успеть его купить, когда он появится на веб-сайте. Другой способ - автоматизировать эту задачу с помощью парсинга веб-страниц с помощью Python.
Это очень полезно для автоматизации поиска в Интернете, расширения поиска на любое количество страниц на сайте и т. д.
Парсинг тестовой страницы
Модуль requests позволяет отправлять HTTP-запросы с помощью Python.
HTTP-запрос возвращает объект Response с данными ответа (содержимое, кодировка, статус и т. д.).
import requests
res = requests.get('ссылка на вашу веб-страницу')
Теперь мы будем использовать библиотеку под названием BeautifulSoup в Python для парсинга веб-страниц.
Beautiful Soup - это библиотека Python для извлечения данных из HTML и XML файлов. Она работает с вашим парсером, чтобы предоставить идиоматические способы навигации, поиска и изменения дерева разбора. Она часто позволяет программистам сэкономить часы или дни работы.
Чтобы узнать больше о ее возможностях, вы можете посмотреть здесь: ссылка
Если у вас нет времени изучать ее документацию и возможности, просто запомните одну вещь: BeautifulSoup может разбирать все, что вы даете ей из веба.
Простой пример парсинга заголовка с тестовой страницы.
from bs4 import BeautifulSoup
page = requests.get("https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
title = soup.title.text # получает текст из тега <title>(...)</title>
Да, это настолько просто.
Теперь вы можете попробовать самостоятельно парсить заголовок, тело, заголовок и т. д., прежде чем мы углубимся в парсинг товаров и их сохранение в CSV.
Ссылка на репозиторий на Github.
import requests
from bs4 import BeautifulSoup
import csv
res = requests.get('https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/')
soup = BeautifulSoup(res.content, 'html.parser')
Теперь мы можем использовать свойства переменной soup для начала парсинга данных.
all_products = []
products = soup.select("div.thumbnail")
for product in products:
name = product.select("h4 > a")[0].text.strip()
price = product.select("h4.price")[0].text.strip()
description = product.select("p.description")[0].text.strip()
reviews = product.select('div.ratings')[0].text.strip()
image = product.select("img")[0].get("src")
all_products.append({
"product_name": name,
"price": price,
"description": description,
"reviews": reviews,
"image": image
})
columns = all_products[0].keys()
with open("my_data.csv", "w", newline="") as file:
dict_writer = csv.DictWriter(file, columns)
dict_writer.writeheader()
dict_writer.writerows(all_products)
Позвольте мне объяснить, что только что произошло выше.
Мы видим, что все данные о продукте находятся в div с классом thumbnail. Ниже приведен HTML, представляющий каждый продукт.
<div class=”thumbnail”><img alt=”item” class=”img-responsive” src=”/webscraper-python-codedamn-classroom-website/cart2.png”/><div class=”caption”><h4 class=”pull-right price”>$1139.54</h4><h4><a class=”title” href=”/webscraper-python-codedamn-classroom-website/test-sites/e-commerce/allinone/product/593" title=”Asus AsusPro Advanced BU401LA-FA271G Dark Grey”>Asus AsusPro Adv…</a></h4><p class=”description”> Asus AsusPro Advanced BU401LA-FA271G Dark Grey, 14", Core i5–4210U, 4GB, 128GB SSD, Win7 Pro 64bit, ENG </p></div><div class=”ratings”><p class=”pull-right”>7 reviews</p><p data-rating=”3"><span class=”glyphicon glyphicon-star”></span><span class=”glyphicon glyphicon-star”></span><span class=”glyphicon glyphicon-star”></span></p></div>
name: Внутри тега <h4>
, за которым следует тег <a>
. Поэтому мы использовали product.select(“h4 > a”)[0].text.strip()
price: Внутри тега <h4>
с классом price
description: Внутри тега <p>
с классом description
reviews: Внутри тега <div>
с классом ratings
image: Внутри тега <img>
с атрибутом src
Затем есть код для записи наших данных, добавленных в список all_products, в CSV. Это делается с помощью модуля csv в Python.
Дайте мне знать, если у вас возникнут какие-либо трудности в комментариях.