Веб-скрейпер на Raspberry Pi

Веб-скрейпер – це інструмент, який використовується для автоматичного витягування даних з веб-сайтів. Він здійснює навігацію по веб-сторінках, збирає інформацію та зберігає її у структурованому форматі. Цей процес часто використовується для різних цілей, таких як маркетингові дослідження, аналіз даних та агрегація контенту. Веб-скрейпінг – це ефективний спосіб швидко збирати великі обсяги даних, уникнувши необхідності вручного введення даних. Однак важливо переконатися, що веб-скрейпінг виконується відповідно до умов і положень цільових веб-сайтів, щоб уникнути будь-яких юридичних або етичних проблем.

Ідея

Я хочу зробити Python веб-скрейпер на Raspberry Pi. Алгоритм його роботи полягатиме в тому, що Raspberry Pi повинна кожної години гуглити фразу “чому кішки так багато сплять?”, відбирати 5 новин і надсилати мені їх у телеграм через бот. Ви можете обрати будь-яку фразу і не одну, а також змінити періодичність запуску веб-скрейпінгу – це дуже просто налаштувати в коді скрейпера.

Конфігурація телеграм бота

Для початку на потрібно створити й налаштувати бота, який надсилатиме нам результати пошуку Google. Механізм та послідовність такого налаштування я детально описував у статті про Raspberry Pi OpenCV тому зараз на цьому зупинятися не буду. Ви можете перейти за посиланням і переглянути деталі. Вам обов’язково треба виконати описані там інструкції, щоб отримати токен бота й ідентифікатор чату, адже вони нам знадобляться для надсилання повідомлень.

Програмний код веб-скрейпера

Не буду описувати процес встановлення операційної системи на Raspberry Pi, вважатиму, що у вас вже є готова Raspberry Pi із встановленою OS Raspbian. В процесі роботи над даним проектом, я використав фрагменти програмного коду веб-скрейпера із цього веб-сайту. Мені довелося додати коректний парсинг URL адреси посилання, а також власне надсилання короткого опису результатів пошуку із посиланнями на веб-сторінки за допомогою телеграм бота.

Що ж, розглянема код та опишемо ключові моменти в ньому:

import requests
from bs4 import BeautifulSoup
from time import sleep

TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"
CHAT_ID = "YOUR_TELEGRAM_CHAT_ID"
query = "чому кішки так багато сплять?"

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

def get_search_results(query):
url = 'https://www.google.com.ua/search?gl=us&q=' + query
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

# Find all the search result this div wrapper
result_divs = soup.find_all('div', class_='Gx5Zad fP1Qef xpd EtOod pkphOe')
results = []

for div in result_divs:
# Only get the organic_results
if div.find('div', class_='egMi0 kCrYT') is None:
continue
# Extracting the title (linked text) from h3
title = div.find('h3').text
# Extracting the URL
link = div.find('a')['href']
# Extracting the brief description
description = div.find('div', class_='BNeawe s3v9rd AP7Wnd').text

results.append({'title': title, 'link': link, 'description': description})

return results

def send_message(message):
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
params = {
"chat_id": CHAT_ID,
"text": message
}
response = requests.post(url, json=params)
# print(response.json())

search_results = get_search_results(query)
counter = 1
for result in search_results:
if counter <=5:
print(result['title'] + "\n" + result['link'] + "\n" + result['description'])
print("-------------")
send_message(f"Знайдено збіг для фрази '{query}':\n\n" + result['description'] + "\n\n" + str(result['link'].split("url=",1)[1]).split("&ved=")[0])
else:
break
counter += 1
sleep(10)

Як ви бачите вище, вам потрібні токен телеграм бота та ідентифікатор чату, які ви можете отримати з інструкцій за посиланням у попередньому кроці. Також ми маємо дві основні функції: get_search_results – для скрейпінгу, а також send_message – для надсилання результатів пошуку в телеграм. В моєму коді Raspberry Pi здійснює скрейпинг, розпаршує результат і надсилає ботом в телеграм коротку інформацію та посилання на кожен із п’яти результатів пошуку із періодичністю в 10 секунд між повідомленнями.

Тепер налаштуємо виконання нашого Python-скрипта з періодичністю в одну годину за допомогою крону:

crontab -e

crontab

І додаємо наш скрипт і правило для його виконання (див. більше налаштувань тут):

00 * * * * /usr/bin/python /home/raspberrypi/web_scraper.py

Перевіряємо роботу веб-скрейпера на Raspberry Pi

При запуску нашого Python-скрипта ми бачимо вивід результату його роботи в консолі:

веб-скрейпер

Також паралельно телеграм бот надсилає результат роботи веб-скрейпера у телеграм. Виглядає це таким чином:

itmakerclub.com cats

Замість висновку

Насправді даний проект можна цікаво розширити. Наприклад можна навчити Raspberry Pi очікувати на повідомлення, яке ви пишете телеграм боту і вже на основі цього повідомлення здійснювати пошукові запити і повертати вам результат, а не робити це по крону. Є багато цікавих можливостей, які ви можете реалізувати для власних потреб. Ви можете сміливо ділитися вашими ідеями й думками у коментарях 😉 

itmakerclub.com Еллі

Spread the love

2 thoughts on “Веб-скрейпер на Raspberry Pi

  1. Ва….
    те що я шукав і вигадував для свого першого проєкту.
    Дуже дякую за змістовне пояснення.
    Гадаю, на деякий час оселюся у ваших роботах)

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *