У цьому блозі я розповім, як я створив Twitter Trends Scraper за допомогою Python, Selenium, Flask, MongoDB та Proxy Mesh. Цей проєкт отримує трендові теми з Twitter, зберігає їх у базі даних і відображає на веб-інтерфейсі.
Якщо ви зацікавлені у веб-скрапінгу, управлінні проксі або створенні повноцінних проєктів, читайте далі!
Проблема
Тренди Twitter надають реальний час для відстеження того, що відбувається у світі. Однак Twitter не надає безкоштовного доступу до API для трендів, і ручні перевірки можуть бути виснажливими. Моя мета полягала в автоматизації цього процесу з дотриманням етичних практик скрапінгу.
Виклики, з якими зіткнувся:
- Вимоги до входу: Для скрапінгу трендів потрібна автентифікація.
- Динамічний вміст: Сторінка трендів Twitter використовує динамічне завантаження, що ускладнює знаходження елементів.
- Блокування IP: Повторні запити з одного IP можуть призвести до обмежень або блокувань.
Рішення
Я використав Selenium для автоматизації дій браузера, Proxy Mesh для маршрутизації запитів через різні IP, і Flask для створення простого веб-додатку. MongoDB зберігає зібрані тренди для подальшого аналізу.
Використані технології
- Python: Основна мова програмування.
- Selenium: Для автоматизації браузера.
- Proxy Mesh: Для використання ротаційних проксі і уникнення блокування IP.
- Flask: Для створення веб-додатку.
- MongoDB: Для зберігання трендів.
- HTML: Для фронтенд інтерфейсу.
Ключові особливості
- Реальний час скрапінгу: Отримує топ-5 трендових тем з Twitter.
- Ротаційні проксі: Використовує Proxy Mesh для обходу обмежень швидкості і уникнення блокувань.
- Зберігання в базі даних: Зберігає результати в MongoDB.
- Веб-інтерфейс: Відображає тренди з додатковими метаданими (наприклад, часова мітка, використаний IP-адрес).
Кроки реалізації
1. Автоматизація входу в Twitter за допомогою Selenium
Увійти в Twitter вимагало автоматизації цього процесу за допомогою Selenium. Ось фрагмент коду:
# Вхід в Twitter
username_input = wait.until(EC.presence_of_element_located((By.NAME, "text")))
username_input.send_keys(TWITTER_USERNAME)
next_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Next']")))
next_button.click()
password_input = wait.until(EC.presence_of_element_located((By.NAME, "password")))
password_input.send_keys(TWITTER_PASSWORD)
login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Log in']")))
login_button.click()
2. Скрапінг трендових тем
Тренди Twitter завантажуються динамічно. За допомогою Selenium я отримав ці тренди, відфільтрувавши непотрібні елементи, такі як “LIVE” або “Trending in India.”
trend_spans = driver.find_elements(
By.XPATH,
"//div[@aria-label='Timeline: Trending now']//span[contains(@class, 'css-')]"
)
valid_trends = [span.text.strip() for span in trend_spans if span.text.startswith("#") or len(span.text.split()) > 1]
3. Управління проксі за допомогою ProxyMesh
Щоб уникнути блокувань IP, я інтегрував ProxyMesh. Кожен запит маршрутизується через нову IP-адресу, що забезпечує безперебійний скрапінг.
def get_proxy():
username = "gamerpro282021"
password = "your_password_here"
proxy_list = [
f"http://{username}:{password}@us-ny.proxymesh.com:31280",
f"http://{username}:{password}@us-dc.proxymesh.com:31280",
f"http://{username}:{password}@us-il.proxymesh.com:31280",
]
return random.choice(proxy_list)
4. Зберігання даних в MongoDB
Кожен набір зібраних трендів зберігається в MongoDB з часовими мітками та IP-адресами.
record = {
"_id": str(uuid.uuid4()),
"nameoftrend1": valid_trends[0],
"nameoftrend2": valid_trends[1],
"nameoftrend3": valid_trends[2],
"nameoftrend4": valid_trends[3],
"nameoftrend5": valid_trends[4],
"datetime": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"ip_address": proxy if proxy else "localhost"
}
collection.insert_one(record)
Створення веб-інтерфейсу за допомогою Flask
Я використав Flask для створення простого веб-додатку, який відображає зібрані тренди.
@app.route('/scrape')
def scrape():
try:
result = scrape_twitter()
return jsonify(result)
except Exception as e:
return jsonify({"error": str(e)}), 500
```
Фронтенд використовує HTML для відображення трендів у зручному та чистому форматі.
Останній веб-додаток
Веб-додаток має:
- Кнопку для запуску процесу скрапінгу.
- Відображення трендових тем в реальному часі.
- Метадані, такі як часова мітка та IP-адреса, що використовувалася для скрапінгу.
Розгортання
Я розмістив проєкт локально і також завантажив його на GitHub для зручного доступу. Повний код можна знайти тут.
[
GitHub - procoding2022/Twitter-Trends-Scraper
Співпрацюйте в розробці procoding2022/Twitter-Trends-Scraper, створивши акаунт на GitHub.
github.com
](https://github.com/procoding2022/Twitter-Trends-Scraper?source=post_page-----82912f48b469--------------------------------)
Чого я навчився
- Обробка динамічного веб-контенту: Отримувати конкретні елементи з динамічних сторінок Twitter було складно, але корисно.
- Управління проксі: Використання Proxy Mesh навчилось ефективно змінювати IP для етичного скрапінгу.
- Інтеграція повного стеку: Поєднання Selenium, Flask і MongoDB в одному проєкті покращило моє розуміння розробки повного стеку.
Майбутні вдосконалення
- Візуалізації: Додати графіки для показу популярності трендів з часом.
- Запланований скрапінг: Автоматизувати скрапер для регулярного виконання.
- Вхід користувача: Дозволити користувачам вибирати регіон для трендів.
Висновок
Цей проєкт показує, як створити повноцінне рішення для скрапінгу з нуля. Використовуючи потужні бібліотеки та інструменти Python, я зміг автоматизувати повторювану задачу і створити корисний інструмент для збору даних у реальному часі.
Не соромтесь спробувати або долучитись до проєкту. Поділіться своїми думками в коментарях нижче!
Перекладено з: How I Built a Twitter Trends Scraper with Selenium, Flask, and Proxy Mesh