CoderCastrov logo
CoderCastrov
Питон

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

Парсинг веб-страниц с помощью Python
просмотров
3 мин чтение
#Питон

Как спарсить данные с веб-сайта и сохранить их в 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.

Дайте мне знать, если у вас возникнут какие-либо трудности в комментариях.