Як я створив скрапер трендів Twitter за допомогою Selenium, Flask та Proxy Mesh

У цьому блозі я розповім, як я створив Twitter Trends Scraper за допомогою Python, Selenium, Flask, MongoDB та Proxy Mesh. Цей проєкт отримує трендові теми з Twitter, зберігає їх у базі даних і відображає на веб-інтерфейсі.

Якщо ви зацікавлені у веб-скрапінгу, управлінні проксі або створенні повноцінних проєктів, читайте далі!

Проблема

Тренди Twitter надають реальний час для відстеження того, що відбувається у світі. Однак Twitter не надає безкоштовного доступу до API для трендів, і ручні перевірки можуть бути виснажливими. Моя мета полягала в автоматизації цього процесу з дотриманням етичних практик скрапінгу.

Виклики, з якими зіткнувся:

  1. Вимоги до входу: Для скрапінгу трендів потрібна автентифікація.
  2. Динамічний вміст: Сторінка трендів Twitter використовує динамічне завантаження, що ускладнює знаходження елементів.
  3. Блокування IP: Повторні запити з одного IP можуть призвести до обмежень або блокувань.

Рішення

Я використав Selenium для автоматизації дій браузера, Proxy Mesh для маршрутизації запитів через різні IP, і Flask для створення простого веб-додатку. MongoDB зберігає зібрані тренди для подальшого аналізу.

Використані технології

  1. Python: Основна мова програмування.
  2. Selenium: Для автоматизації браузера.
  3. Proxy Mesh: Для використання ротаційних проксі і уникнення блокування IP.
  4. Flask: Для створення веб-додатку.
  5. MongoDB: Для зберігання трендів.
  6. 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--------------------------------)

Чого я навчився

  1. Обробка динамічного веб-контенту: Отримувати конкретні елементи з динамічних сторінок Twitter було складно, але корисно.
  2. Управління проксі: Використання Proxy Mesh навчилось ефективно змінювати IP для етичного скрапінгу.
  3. Інтеграція повного стеку: Поєднання Selenium, Flask і MongoDB в одному проєкті покращило моє розуміння розробки повного стеку.

Майбутні вдосконалення

  1. Візуалізації: Додати графіки для показу популярності трендів з часом.
  2. Запланований скрапінг: Автоматизувати скрапер для регулярного виконання.
  3. Вхід користувача: Дозволити користувачам вибирати регіон для трендів.

Висновок

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

Не соромтесь спробувати або долучитись до проєкту. Поділіться своїми думками в коментарях нижче!

Перекладено з: How I Built a Twitter Trends Scraper with Selenium, Flask, and Proxy Mesh

Leave a Reply

Your email address will not be published. Required fields are marked *