Як використовувати Hrequests для вебскрапінгу

Як використовувати Hrequests для вебскрапінгу

У цьому посібнику я покажу, як збирати інформацію з вебсайтів за допомогою Hrequests. Не хвилюйтеся, якщо ви новачок у цьому — я поясню все просто і покажу крок за кроком.

Почнемо зі встановлення Hrequests та надсилання HTTP-запити, а потім ми зануримося в роботу з кількома сторінками, обробку динамічного контенту та навіть використання конкурентності, щоб пришвидшити процес. Наприкінці ви знатимете, як вебскрапити сайти на професійному рівні.

Якщо вас цікавить вебскрапінг і ви хочете простий спосіб почати, цей посібник для вас. Почнімо!

Що таке Hrequests?

Hrequests означає «людські запити». Це бібліотека Python, створена для вебскрапінгу. Hrequests поєднує HTTP-клієнт, HTML-парсер і браузер без графічного інтерфейсу. Це означає, що її можна використовувати для збирання даних як зі статичних, так і з динамічних сайтів. Бібліотека проста у використанні й ідеально підходить тим, хто лише починає працювати з вебскрапінгом.

Hrequests може спростити ваші проєкти з вебскрапінгу. Якщо сайт показує вміст у простому HTML, можна використовувати HTTP-клієнт і парсер. Якщо потрібно взаємодіяти із сайтами, що завантажують дані через JavaScript, можна скористатися headless-браузером. У Hrequests також є параметр mock, який імітує поведінку людини. Це може допомогти уникнути виявлення ботів на деяких сайтах.

Покращте своє середовище для вебскрапінгу з Bright Data

Розширені проксі-сервіси Bright Data забезпечують надійні високошвидкісні з’єднання, які органічно доповнюють Hrequests. Інтегрувавши їхні резидентські проксі з ротацією у свій робочий процес вебскрапінгу, ви можете обходити антиботові заходи й покращити отримання даних без складних налаштувань.

Дізнайтеся більше про бренди на моїй стаття про найкращих постачальників проксі.

Початок роботи з Hrequests

Перш ніж почати, переконайтеся, що на вашому комп’ютері встановлено Python 3. Ви можете завантажити найновішу версію Python з офіційного сайту. Після встановлення Python ви можете встановити Hrequests за допомогою pip. Відкрийте термінал або командний рядок і введіть таку команду:

pip install -U hrequests[all]

Ця команда встановить Hrequests разом із його допоміжними бібліотеками. Одна з цих бібліотек — Playwright, яку Hrequests використовує для функції headless-браузера.

Наступним кроком потрібно встановити вебдрайвери для Playwright. Виконайте цю команду:

playwright install

After you have installed Hrequests and the web drivers, create a new folder for your project. Open your favorite code editor and create a new Python file, for example, scraper.py. You are now ready to start coding your web scraper.

Дізнайтеся більше про вебскрапінг за допомогою Playwright тут.

Створення першого HTTP-запиту

The first step in web scraping is to send an HTTP request to a website and get its HTML content. Hrequests makes this task simple. In your scraper.py file, start by importing Hrequests:

import hrequests

Далі скористайтеся методом get, щоб надіслати запит до цільового вебсайту. Наприклад, якщо ви хочете зібрати дані з демонстраційного сайту електронної комерції, можна використати такий код:

response = hrequests.get("https://www.scrapingcourse.com/ecommerce/")

Цей рядок коду надсилає GET-запит до сайту. Об’єкт відповіді містить HTML сторінки. Щоб переглянути HTML, ви можете вивести текст відповіді:

html_content = response.text
print(html_content)

Коли ви запустите цей код, повний HTML-вміст сторінки буде виведено в консоль. Це ваш перший крок до вебскрапінгу.

Витягування даних з HTML

Після того як ви отримаєте HTML-вміст, наступний крок — витягти корисні дані. Вебсторінки містять багато елементів, як-от абзаци, зображення та посилання. У Hrequests є вбудований HTML-парсер, який допоможе вам знайти ці елементи. Припустімо, ви хочете витягти зі сторінки інтернет-магазину дані про товар, такі як назва товару, ціна, URL і джерело зображення.

Спочатку відкрийте сайт у браузері. Клацніть правою кнопкою миші по товару й виберіть «Переглянути код», щоб побачити HTML-структуру. Ви можете помітити, що кожен товар міститься в

  • тег із класом на кшталт «product». З цією інформацією ви можете використовувати CSS-селектори, щоб знаходити ці елементи.

 

Ось приклад фрагмента коду для витягування даних про товар:

# Obtain all the product containers
products = response.html.find_all(".product")
# Create an empty list to hold the product data
product_data = []
# Loop through each product container to extract details
for product in products:
data = {
"name": product.find(".woocommerce-loop-product__title").text,
"price": product.find(".price").text.replace("n", ""),
"url": product.find("a").href,
"img": product.find("img").src
}
product_data.append(data)
# Print the extracted product data
print(product_data)

У наведеному вище коді ми спочатку знаходимо всі елементи з класом .product. Потім ми проходимося по цих елементах і витягуємо потрібний текст та атрибути. Ми використовуємо метод replace, щоб прибрати небажані символи нового рядка з даних про ціну.

Коли ви запустите цей код, у консолі буде виведено список словників. Кожен словник представляє товар із його назвою, ціною, URL-адресою та джерелом зображення.

Збереження даних у CSV-файл

Зберігання даних, зібраних під час вебскрапінгу, у CSV-файлі — поширена практика. Вбудований у Python модуль CSV робить це завдання простим. Коли у вас є дані про товари у списку словників, ви можете записати їх у CSV-файл.

Ось як це можна зробити:

import csv
# Define the keys from the first product dictionary
keys = product_data[0].keys()
# Open a new CSV file in write mode
with open("product_data.csv", "w", newline="", encoding="utf-8") as output_file:
dict_writer = csv.DictWriter(output_file, fieldnames=keys)
dict_writer.writeheader()
dict_writer.writerows(product_data)
print("CSV-файл успішно створено")

This code snippet creates a CSV file named product_data.csv and writes the header and rows. You will see the data in a table format when you open the file. This method is useful for saving and later analyzing your scraped data.

Scraping Multiple Pages

Багато сайтів використовують пагінацію, щоб відображати велику кількість елементів. Якщо вам потрібно зібрати дані з усіх сторінок, вам доведеться послідовно переглядати кожну сторінку. Подивімося, як можна змінити ваш код, щоб обробляти кілька сторінок.

Використання циклу для пагінації

Припустимо, що сайт показує товари на кількох сторінках із кнопкою “Next”. Наведений нижче код використовує цикл while, щоб перевіряти наявність наступної сторінки та збирати дані, доки не залишиться більше доступних сторінок:

# Define a function to scrape the current page
def scraper(response):
products = response.html.find_all(".product")
product_data = []
for product in products:
data = {
"name": product.find(".woocommerce-loop-product__title").text,
"price": product.find(".price").text.replace("n", ""),
"url": product.find("a").href,
"img": product.find("img").src
}
product_data.append(data)
return product_data
# Start by requesting the first page
response = hrequests.get("https://www.scrapingcourse.com/ecommerce/")
# List to collect all products
all_products = []
while True:
# Scrape the data from the current page
all_products.extend(scraper(response))
# Find the next page element
next_page = response.html.find(".next")
# If the next page is found, continue scraping
if next_page:
response = hrequests.get(next_page.href)
else:
break
print(all_products)

Цей код визначає функцію scraper для збирання даних зі сторінки. Потім ми перебираємо сторінки, використовуючи кнопку «Next». Коли наступної сторінки немає, цикл зупиняється. Такий підхід допомагає зібрати дані з усіх сторінок сайту.

Використання конкурентності для швидшого вебскрапінгу

Коли у вас багато сторінок для вебскрапінгу, обробка їх по одній може зайняти багато часу. Hrequests підтримує конкурентне виконання. Це означає, що ви можете надсилати запити до кількох сторінок одночасно. Багато сайтів мають URL-адреси з номерами сторінок, наприклад:

https://www.scrapingcourse.com/ecommerce/page/1/
https://www.scrapingcourse.com/ecommerce/page/2/
…

Докладніше про конкурентний вебскрапінг за допомогою Python.

Вебскрапінг кількох сторінок одночасно

Ось приклад того, як одночасно збирати дані з кількох сторінок:

# List of URLs for each page
urls = [
"https://www.scrapingcourse.com/ecommerce/page/1/",
"https://www.scrapingcourse.com/ecommerce/page/2/",
"https://www.scrapingcourse.com/ecommerce/page/3/",
"https://www.scrapingcourse.com/ecommerce/page/4/",
"https://www.scrapingcourse.com/ecommerce/page/5/",
"https://www.scrapingcourse.com/ecommerce/page/6/",
"https://www.scrapingcourse.com/ecommerce/page/7/",
"https://www.scrapingcourse.com/ecommerce/page/8/",
"https://www.scrapingcourse.com/ecommerce/page/9/",
"https://www.scrapingcourse.com/ecommerce/page/10/",
"https://www.scrapingcourse.com/ecommerce/page/11/",
"https://www.scrapingcourse.com/ecommerce/page/12/"
]
# Request all URLs concurrently
responses = hrequests.get(urls)
# List to hold all product data
all_products = []
# Loop through each response to extract product data
for response in responses:
all_products.extend(scraper(response))
print(all_products)

Цей метод надсилає запити до всіх сторінок одночасно. Потім він проходить по кожній відповіді та збирає дані про товари. Конкурентність прискорює процес вебскрапінгу. Це дуже корисно, коли потрібно швидко зібрати дані з багатьох сторінок.

Scraping JavaScript-Rendered Pages

Не всі сайти віддають статичний HTML. Деякі сайти завантажують контент через JavaScript. Hrequests має вбудований headless-браузер. Ця можливість може рендерити сторінки, яким потрібен JavaScript. Один поширений приклад — нескінченне прокручування. За нескінченного прокручування новий контент завантажується, коли ви прокручуєте сторінку вниз.

Використання Hrequests для динамічного контенту

Let us see how to scrape a page that uses infinite scrolling. In this example, we will scrape a website that loads product items as you scroll.

Спершу імпортуйте клас Session з Hrequests і модуль time:

from hrequests import Session
import time

Налаштування headless-браузера

Створіть сеанс із браузером без графічного інтерфейсу. Ви можете вибрати браузер, як-от Chrome:

session = Session(browser="chrome")
Now, create a page session and load the target website:
page = session.render("https://www.scrapingcourse.com/infinite-scrolling")

Прокручування сторінки

Ідея полягає в тому, щоб прокручувати сторінку вниз, доки новий контент не перестане завантажуватися. Для прокручування можна використовувати JavaScript. Скористайтеся методом evaluate, щоб виконати JavaScript у браузері:

# Get the current height of the page
last_height = page.evaluate("document.body.scrollHeight")
while True:
# Scroll down the page
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
# Wait for new content to load
time.sleep(10)
# Get the new height after scrolling
new_height = page.evaluate("document.body.scrollHeight")
# Check if the page height has not increased
if new_height == last_height:
break
# Update the height
last_height = new_height

Цей цикл і далі прокручуватиме сторінку, доки вона не перестане завантажувати новий вміст.

Витягування даних після прокручування

Після того як сторінка перестане завантажувати новий контент, ви можете витягнути дані про товари. Визначте функцію для вебскрапінгу даних із динамічної сторінки:

def scraper(page):
products = page.html.find_all(".product-item")
product_data = []
for product in products:
data = {
"name": product.find(".product-name").text,
"price": product.find(".product-price").text
}
product_data.append(data)
print(product_data)
# Call the scraper function
scraper(page)
# Close the browser session
page.close()

Цей код виведе назви товарів і ціни зі сторінки з нескінченним прокручуванням. Браузер без інтерфейсу допомагає завантажити й відрендерити весь JavaScript-вміст.

Робота з викликами та обмеженнями

Хоча Hrequests є потужним інструментом, він має певні обмеження. Одне з них — невелика база користувачів. Через це може бути складніше знайти допомогу, якщо у вас виникнуть проблеми. Ще одна проблема полягає в тому, що Hrequests не підтримує автентифікацію проксі. Багатьом преміум-проксі-сервісам потрібна ця функція.

Крім того, Hrequests може не обходити просунуті антибот-системи. Сайти, захищені такими сервісами, як Cloudflare, Akamai або DataDome, можуть блокувати ваш вебскрапер. Наприклад, якщо ви спробуєте скрапити сайт із потужним антибот-захистом, замість повного HTML-вмісту ви можете отримати заблоковану відповідь.

Overcoming Anti-Bot Measures

Якщо ви зіткнетеся із системами антибот-захисту, може знадобитися альтернативне рішення. Одне з таких рішень — Bright Data API. Bright Data бере на себе ротацію проксі, headless-браузери та розв’язання CAPTCHA. Це допомагає обходити більшість антибот-засобів.

Ось приклад, як ви можете використовувати Bright Data у своєму коді Python:

import requests
url = "https://www.g2.com/products/asana/reviews"
apikey = ""
params = {
"url": url,
"apikey": apikey,
"js_render": "true",
"premium_proxy": "true",
}
response = requests.get("https://api.brightdata.com/v1/", params=params)
print(response.text)

Цей код надсилає запит до Bright Data API. Далі Bright Data обробляє ротацію проксі та рендеринг JavaScript. У результаті ви можете отримувати доступ до сайтів, які зазвичай блокують ваш вебскрапер.

Bright Data — це хороша альтернатива, коли ви стикаєтеся з жорстким антибот-захистом. Водночас Hrequests і далі залишається чудовим інструментом для багатьох завдань вебскрапінгу. Ви можете обрати інструмент, який найкраще відповідає вашим потребам.

Найкращі практики вебскрапінгу

Коли ви використовуєте Hrequests або будь-який інший інструмент для вебскрапінгу, важливо дотримуватися кількох найкращих практик. Ось кілька порад:

  1. Respect the Website’s Robots.txt: Many websites have a robots.txt file. This file tells you which parts of the website you are allowed to scrape. Always check this file before you start scraping.
  2. Не перевантажуйте вебсайт: Обов'язково додавайте затримки між запитами. Це допоможе уникнути надсилання надто багатьох запитів за короткий час. Перевантаження сервера може призвести до блокування вашої IP-адреси.
  3. Handle Errors Gracefully: Сайти можуть змінювати свою структуру будь-коли. Обов’язково додайте обробку помилок у свій код. Так ваш вебскрапер зможе обробляти відсутні елементи або проблеми з підключенням без аварійного завершення роботи.
  4. Use Concurrency Wisely: Хоча паралельність може пришвидшити ваш вебскрапінг, не надсилайте забагато запитів одночасно. Враховуйте навантаження на сервер цільового вебсайту, щоб не спричиняти проблем.
  5. Store Data Securely: Під час збереження даних у файли або бази даних переконайтеся, що ви зберігаєте їх безпечно. Завжди перевіряйте та очищуйте дані, щоб уникнути проблем пізніше.

Conclusion

Hrequests — це потужна й проста у використанні бібліотека для вебскрапінгу на Python. Її здатність працювати як зі статичним, так і з динамічним контентом робить її чудовим вибором для багатьох проєктів. Незалежно від того, чи ви скрапите простий сайт електронної комерції, чи складний вебсайт із нескінченною прокруткою, Hrequests допоможе вам впоратися із завданням. Скористайтеся прикладами в цьому посібнику, щоб почати власні проєкти. Із практикою та ретельним плануванням ви зможете створювати ефективні вебскрапери, які відповідатимуть вашим потребам.

Схожі записи