перейти к содержанию

Парсинг веб-страниц с помощью Python: единственное руководство, которое вам когда-либо понадобится

Всем привет! Если вы хотите узнать, как использовать Python для парсинга веб-страниц, вы попали по адресу. Это подробное руководство научит вас всему, что нужно для извлечения данных с веб-сайтов.

Давайте начнем!

Зачем использовать Python для парсинга веб-страниц?

Python — один из самых популярных языков, используемых для парсинга веб-страниц, благодаря своим многочисленным преимуществам:

Простота – По мнению программистов, Python имеет простой для чтения синтаксис и более интуитивен, чем такие языки, как Java. Это позволяет новичкам легко писать и понимать код парсинга веб-страниц.

Доступные библиотеки – Python имеет обширную коллекцию библиотек, специально предназначенных для парсинга веб-страниц. Некоторые популярные из них включают BeautifulSoup, Scrapy, Selenium и многие другие. Некоторые из них мы рассмотрим подробно позже.

Скорость – Для большинства задач по парсингу веб-страниц Python обеспечивает отличную производительность. Библиотеки, такие как Asyncio, позволяют асинхронно очищать данные для повышения скорости.

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

Обработка данных – После очистки данные необходимо хранить и анализировать. Python упрощает экспорт данных в JSON, CSV, Excel, базы данных и т. д.

Сообщество – По данным Reddit, у Python одно из крупнейших сообществ разработчиков. Всегда есть помощь в решении проблем с парсингом веб-страниц!

Обзор процесса парсинга веб-страниц

При создании веб-скрейпера вы обычно выполняете следующие ключевые шаги:

  1. Отправить запросы – Используйте HTTP-клиент Python для отправки запросов на целевую веб-страницу и получения HTML-кода.

  2. Разобрать HTML – Используйте парсер, такой как BeautifulSoup, для анализа HTML и извлечения соответствующих данных.

  3. Хранить данные – Запишите извлеченные данные в файл формата JSON или сохраните их в базе данных.

  4. Чистые данные – Преобразуйте, нормализуйте и очистите очищенные данные по мере необходимости для анализа.

  5. Анализировать/Визуализировать – При необходимости проанализируйте и визуализируйте данные с помощью таких библиотек, как Pandas, Matplotlib и т. д.

Теперь давайте углубимся в некоторые библиотеки Python, которые помогут на каждом этапе этого процесса.

Отправка запросов с помощью HTTP-клиентов

Чтобы очистить веб-страницу, нам сначала нужно загрузить ее HTML-содержимое с помощью HTTP-запроса. Давайте рассмотрим некоторые клиентские библиотеки HTTP.

Запросы

Requests — самая популярная библиотека Python, используемая для отправки HTTP-запросов. По данным GitHub, он имеет более 65,000 XNUMX звезд и поддерживается в хорошем состоянии.

Вот как можно использовать Requests для отправки запроса GET:

import requests

response = requests.get(‘https://www.example.com‘)
print(response.status_code)
print(response.text)

Некоторые ключевые особенности запросов:

  • Поддерживает такие методы, как GET, POST, PUT, DELETE.
  • Автоматическое кодирование/декодирование данных запроса/ответа
  • Встроенный пул соединений и поддержка сеансов.
  • Обработка файлов cookie, таймаутов, повторных попыток, перенаправлений
  • Беспрепятственно работает с HTTP-аутентификацией и прокси-серверами.

В целом, Requests позволяет очень легко отправлять запросы и приступать к парсингу веб-страниц!

HTTPX

HTTPX — это HTTP-клиент нового поколения для Python. Он использует HTTP/1.1 и HTTP/2 и предоставляет как асинхронные, так и синхронизирующие API.

Вот как вы можете использовать HTTPX для отправки запроса GET:

import httpx

with httpx.Client() as client:
  response = client.get(‘https://www.example.com‘)
  print(response.text) 

Зачем рассматривать HTTPX?

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

Таким образом, HTTPX отлично подходит, если вам нужно больше контроля и современных функций по сравнению с запросами.

Анализ HTML и извлечение данных

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

КрасивыйСуп

Beautiful Soup — ведущая библиотека Python, используемая для анализа документов HTML и XML. Он позволяет легко анализировать деревья разбора страниц.

Вот как вы можете использовать BeautifulSoup для извлечения заголовка страницы:

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, ‘html.parser‘)
page_title = soup.select_one(‘title‘).text

Некоторые звездные особенности BeautifulSoup:

  • Поддерживает анализ сломанного HTML.
  • Позволяет искать, перемещаться и изменять деревья синтаксического анализа.
  • Поддержка CSS-селектора и Project Query для синтаксического анализа.
  • Встроенные методы для общих задач
  • Может обрабатывать преобразования кодировок
  • Хорошо интегрируется с популярными библиотеками для очистки данных, такими как Scrapy.

В целом, BeautifulSoup упрощает анализ HTML!

lxml

По словам веб-разработчиков, lxml — чрезвычайно быстрая и эффективная библиотека синтаксического анализа HTML и XML в Python.

Вот как вы можете использовать lxml для извлечения ссылок со страницы:

from lxml import html

root = html.fromstring(response.text)
links = root.cssselect(‘a‘)

Ключевые преимущества использования lxml:

  • Очень быстро благодаря библиотекам C, на которых он основан.
  • Поддерживает XPath, селекторы CSS и XSLT.
  • Отлично подходит для работы с большими документами XML/HTML.
  • Создает легкие деревья для анализа документов.
  • Хорошо интегрируется с Scrapy, BeautifulSoup и т. д.

Поэтому рассмотрите lxml, когда скорость и производительность имеют решающее значение.

пикери

Если вам нужен легкий парсер HTML, попробуйте pyquery. Он позволяет использовать синтаксис, подобный jQuery, для запроса элементов.

Вот как вы можете извлекать ссылки с помощью pyquery:

from pyquery import PyQuery as pq

doc = pq(response.text)
links = doc(‘a‘) 

Некоторые удобные функции pyquery:

  • Синтаксис, подобный jQuery, для выбора элемента
  • Поддерживает селекторы CSS для анализа.
  • Методы обхода и манипулирования DOM
  • Маленький и простой API

pyquery отлично подходит для выполнения основных повседневных задач синтаксического анализа и извлечения данных.

Чтение и запись очищенных данных

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

JSON

JSON — это распространенный формат, используемый веб-API. В Python мы можем использовать модуль json для анализа ответов JSON и кодирования данных в виде строк JSON.

Например:

import json

data = {‘name‘: ‘John‘, ‘age‘: 28}
json_data = json.dumps(data)
# ‘{"name": "John", "age": 28}‘

json_data = ‘{"name": "Mary", "age": 32}‘ 
parsed_data = json.loads(json_data)
# {‘name‘: ‘Mary‘, ‘age‘: 32}

Как видите, это довольно просто!

CSV

Для табличных данных CSV (значения, разделенные запятыми) — это быстрый и удобный формат. Мы можем использовать модуль CSV Python для чтения и записи файлов CSV.

Вот пример:

import csv

with open(‘data.csv‘, ‘w‘) as file:
  writer = csv.writer(file)
  writer.writerow([‘Name‘, ‘Age‘])  
  writer.writerow([‘John‘, 28]) 
  writer.writerow([‘Mary‘, 32])

with open(‘data.csv‘, ‘r‘) as file:
  reader = csv.reader(file)
  for row in reader:
    print(row) 

Таким образом, CSV-файлы отлично подходят для основных задач очистки данных, связанных с таблицами данных.

Панды

Pandas — очень популярная библиотека анализа данных Python. Он также может обрабатывать чтение и запись данных в таких форматах, как JSON, CSV, Excel и других.

Например:

import pandas as pd

df = pd.read_json(‘data.json‘)
df.to_csv(‘data.csv‘) 
df.to_excel(‘data.xlsx‘)

Pandas позволяет легко очищать, анализировать и выводить очищенные данные для дальнейшего использования.

SQLite

Для бессерверного хранения данных SQLite — отличный вариант реляционной базы данных. Мы можем использовать модуль sqlite3 для доступа к базам данных SQLite из Python.

Вот пример создания таблицы базы данных и вставки некоторых очищенных данных:

import sqlite3 

conn = sqlite3.connect(‘database.db‘)

c = conn.cursor()
c.execute(‘‘‘
  CREATE TABLE data (name text, age integer)  
‘‘‘)

c.execute("INSERT INTO data VALUES (‘John‘, 28)")

conn.commit()
conn.close()

SQLite хорошо работает для небольших и средних проектов по парсингу веб-страниц.

Парсинг сайтов с большим количеством JavaScript

Современные веб-сайты в значительной степени полагаются на JavaScript для динамического отображения контента. Чтобы парсить эти сайты, нам нужны такие браузеры, как Selenium и Playwright.

Селен

Selenium напрямую управляет такими браузерами, как Chrome и Firefox, с помощью API WebDriver. Это позволяет ему выполнять код JavaScript и отображать полные страницы.

Вот как извлечь заголовок страницы с помощью Selenium:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get(‘https://www.example.com‘)

title = driver.find_element_by_css_selector(‘h1‘).text  
driver.quit()

Некоторые примечательные особенности Selenium:

  • Поддерживает такие браузеры, как Chrome, Firefox, Safari.
  • Может автоматизировать отправку форм и клики
  • Выполняет JavaScript в браузере
  • Работает без головы, не требуя графического интерфейса

В целом, Selenium идеально подходит для очистки контента, загружаемого с помощью JavaScript.

Драматург

Playwright — это новая библиотека автоматизации браузера от Microsoft. Он эмулирует действия пользователя и собирает данные с динамических веб-страниц.

Вот как вы можете извлечь заголовок страницы с помощью Playwright:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
  browser = p.chromium.launch()
  page = browser.new_page()
  page.goto(‘https://www.example.com‘)

  print(page.title())
  browser.close()

Почему драматург?

  • Безголовая автоматизация браузера
  • Эмуляция мобильного устройства
  • Функция автоматического ожидания
  • Перехват сетевого трафика
  • Высокая производительность
  • Активное сообщество разработчиков

Итак, Playwright — очень эффективная альтернатива Selenium для динамического парсинга.

Сканирование целых сайтов с помощью Scrapy

Хотя инструменты, которые мы рассмотрели, отлично подходят для одноразовых парсеров, Scrapy — это специальная платформа веб-сканирования для крупных проектов.

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

Вот простой паук Scrapy:

import scrapy

class ExampleSpider(scrapy.Spider):

  name = ‘example‘

  def start_requests(self):
    url = ‘https://www.example.com‘
    yield scrapy.Request(url, callback=self.parse)

  def parse(self, response):
    for h2 in response.css(‘h2‘):
      yield {‘title‘: h2.css(‘::text‘).get()}

    for link in response.css(‘a::attr(href)‘):
      yield response.follow(link, callback=self.parse)

Примечательные особенности Scrapy:

  • Определите правила сканирования для рекурсивного анализа страниц.
  • Извлекайте данные с помощью CSS/XPath и специального промежуточного программного обеспечения.
  • Следуйте файлам Sitemap и шаблонам нумерации страниц автоматически
  • Параллельная очистка в масштабе
  • Экспортируйте очищенные данные в любой необходимый формат.

Таким образом, Scrapy идеально подходит для крупных структурированных проектов по парсингу веб-страниц.

Развертывание и планирование парсеров Python

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

апифай

Apify позволяет развертывать парсеры Python в виде контейнеров Docker, называемых Актерами. Вы можете запускать этих Актеров и управлять ими в облаке Apify.

Вот пример использования API Apify:

from apify_client import ApifyClient

client = ApifyClient(‘MY_API_TOKEN‘)

run = client.actor(‘john/web-scraper‘).call()

print(client.dataset(‘default‘).items) 

Некоторые полезные функции Apify:

  • Развертывание парсеров как контейнеров Docker
  • Запланируйте повторяющиеся задания по очистке
  • Масштабируйте с помощью прокси и безголовых браузеров
  • Управление наборами данных и историей сканирования
  • Мониторинг использования ресурсов и ошибок
  • Визуальная панель управления скреперами

Таким образом, Apify идеально подходит для бесперебойной работы парсеров Python в облаке.

Скрэпи-облако

Scrapy Cloud позволяет легко запускать Scrapy Spider в облаке без настройки серверов и контейнеров.

Вы развертываете пауков, а затем Scrapy Cloud занимается масштабированием, хранением, планированием и т. д.

from scrapy import signals  
from scrapy.exporters import CsvItemExporter

class CSVPipeline(object):

  def spider_opened(self, spider):
    self.file = open(‘data.csv‘, ‘wb‘)
    self.exporter = CsvItemExporter(self.file)
    self.exporter.start_exporting()

  def spider_closed(self, spider):  
    self.exporter.finish_exporting()
    self.file.close()  

  def process_item(self, item, spider):
    self.exporter.export_item(item)
    return item

Почему Scrapy Cloud?

  • Быстро запускайте пауков Scrapy без серверов
  • Автоматически масштабируемый паук справляется с пиками трафика
  • Планируйте работу пауков и интегрируйте хранилище
  • Мониторинг журналов и оповещения в реальном времени
  • Простая визуальная панель управления для управления всеми пауками

Так что, если вы любите Scrapy, Scrapy Cloud упрощает развертывание.

Советы по эффективному парсингу веб-страниц

Вот несколько ключевых советов, которые помогут обеспечить правильную работу скребков:

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

  • Используйте режим инкогнито или приватный браузер при тестировании парсеров, чтобы избежать проблем с кешированием.

  • Просмотрите файл robots.txt сайтов, чтобы определить разделы, которые нельзя легально очистить.

  • Сначала напишите парсеры для извлечения небольших фрагментов данных. Затем перейдите к полностраничному парсингу.

  • Используйте прокси, случайные задержки и заголовки, чтобы имитировать людей и избегать блоков.

  • Ограничьте частоту запросов, чтобы избежать перегрузки серверов и попадания в черный список.

  • На сайтах электронной коммерции сохраняйте файлы cookie/сессии для сохранения данных корзины по всем запросам.

  • Следуйте этическим нормам, например не перегружайте сайты, извлекайте только общедоступные данные и по возможности кэшируйте контент локально.

Заключение

Как вы видели, Python невероятно универсален для парсинга веб-страниц — от простых личных проектов до сложных коммерческих систем.

Ключом является выбор правильных библиотек и инструментов для ваших нужд. Освоение таких библиотек, как Requests, BeautifulSoup, Selenium и Scrapy, позволит вам надежно извлекать данные практически с любого веб-сайта.

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

Удачного парсинга веб-страниц Python!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *