Как предотвратить блокировку Twitter при обновлении страницы при очистке твитов с помощью Selenium или альтернатив?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как предотвратить блокировку Twitter при обновлении страницы при очистке твитов с помощью Selenium или альтернатив?

Сообщение Anonymous »

Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой степени работает, я столкнулся с проблемами обнаружения ботов и блокировкой страниц после нескольких обновлений.
Хотя я написал код с использованием Selenium, я рад изучить другие методы (такие как BeautifulSoup, Scrapy или любая другая библиотека Python), если они могут более эффективно достичь моей цели и свести к минимуму обнаружение.
Моя цельСценарий должен:
  • Автоматический вход в Twitter.
  • Перейдите к профилю конкретного пользователя (в данном случае Фабрицио Романо: https://twitter.com). /FabrizioRomano).
  • Захватывайте и распечатывайте последние твиты со страницы.
  • Избегайте печати одного и того же твита несколько раз, даже если он появляется снова после появления нового. твиты удаляются.
  • Исключить закрепленные твиты и репосты (ретвиты).
Вот скрипт, который я написал с помощью Selenium:

Код: Выделить всё

import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import configparser
import time
import random

class TwitterScraper:
def __init__(self, proxy=None, user_agent=None):
# Configure undetected ChromeDriver with optional proxy and user-agent
options = uc.ChromeOptions()

if proxy:
options.add_argument(f"--proxy-server={proxy}")
if user_agent:
options.add_argument(f"user-agent={user_agent}")

options.add_argument("--headless")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--disable-infobars")
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--lang=en-US")
options.add_argument("--window-size=1920,1080")

self.driver = uc.Chrome(options=options)
self.printed_tweets = set()  # Track printed tweets

def login(self):
try:
print("Navigating to Twitter login page...")

# Load credentials from Account.ini
config = configparser.ConfigParser()
config.read(r"C:\Users\Gaming\Documents\Python Tweets\Account.ini")

email = config.get("x", "email", fallback=None)
username_value = config.get("x", "username", fallback=None)
password_value = config.get("x", "password", fallback=None)

if not email or not password_value or not username_value:
raise ValueError("Email, username, or password missing in Account.ini")

self.driver.get("https://twitter.com/i/flow/login")
time.sleep(3)  # Wait for the page to load

# Enter email
email_field = WebDriverWait(self.driver, 15).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[autocomplete="username"]'))
)
email_field.send_keys(email)
email_field.send_keys("\n")
time.sleep(3)

# Enter username if prompted
try:
username_field = WebDriverWait(self.driver, 5).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[data-testid="ocfEnterTextTextInput"]'))
)
username_field.send_keys(username_value)
username_field.send_keys("\n")
time.sleep(3)
except:
print("No additional username prompt detected.")

# Enter password
password_field = WebDriverWait(self.driver, 15).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[name="password"]'))
)
password_field.send_keys(password_value)
password_field.send_keys("\n")
time.sleep(5)
print("Login successful.")
except Exception as e:
print(f"Error during login: {e}")
self.restart()

def navigate_to_page(self, username):
try:
print(f"Navigating to @{username}'s Twitter page...")
user_url = f"https://twitter.com/{username}"
self.driver.get(user_url)
time.sleep(random.uniform(3, 5))
except Exception as e:
print(f"Error navigating to @{username}'s page:  {e}")

def get_recent_tweets(self, num_tweets=3):
try:
WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'article[role="article"]'))
)
tweets = self.driver.find_elements(By.CSS_SELECTOR, 'article[role="article"]')
recent_tweets = []

for tweet in tweets:
# Skip pinned tweets and retweets
if tweet.find_elements(By.CSS_SELECTOR, 'svg[aria-label="Pinned Tweet"]') or \
tweet.find_elements(By.CSS_SELECTOR, 'svg[aria-label="Retweet"]'):
continue

# Fetch tweet text
try:
tweet_text = tweet.find_element(By.CSS_SELECTOR, 'div[data-testid="tweetText"]').text.strip()
except:
continue

# Fetch timestamp
try:
time_element = tweet.find_element(By.XPATH, './/time')
timestamp = time_element.get_attribute("datetime")
except:
continue

recent_tweets.append((timestamp, tweet_text))
if len(recent_tweets) >= num_tweets:
break

return recent_tweets
except Exception as e:
print(f"Error fetching tweets: {e}")
return []

def start(self, username):
self.login()
self.navigate_to_page(username)

while True:
recent_tweets = self.get_recent_tweets(num_tweets=3)

if recent_tweets:
# Get the most recent tweet (first one in the list)
newest_time, newest_tweet = recent_tweets[0]

if newest_tweet not in self.printed_tweets:
print(f"[{newest_time}] {newest_tweet}")
self.printed_tweets.add(newest_tweet)

time.sleep(5)  # Refresh every 5 seconds
self.driver.refresh()

def restart(self):
print("Restarting browser...")
self.driver.quit()
self.__init__()  # Reinitialize the driver

def quit(self):
self.driver.quit()

# Usage
if __name__ == "__main__":
scraper = TwitterScraper(proxy=None, user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
try:
scraper.start(username="FabrizioRomano")
except KeyboardInterrupt:
print("Exiting...")
scraper.quit()
Текущие проблемы
Мой скрипт сканирует первые три твита после каждого обновления, но не может надежно исключить закрепленные твиты и ретвиты с помощью Только CSS-селекторы. Это приводит к тому, что ранее напечатанные твиты появляются снова, когда новые твиты удаляются. Я хочу, чтобы сценарий гарантировал, что ни один твит не будет напечатан более одного раза, даже если он появится позже. Например, если исходными твитами являются Tweet1, Tweet2 и Tweet3, сценарий должен вывести Tweet1. Если после обновления твиты изменятся на Tweet2, Tweet4 и Tweet5, сценарий должен напечатать Tweet2. Если при следующем обновлении отображаются Tweet1, Tweet4 и Tweet5, сценарий не должен перепечатывать Tweet1. Кроме того, после нескольких обновлений страницы Twitter блокирует просмотр сообщений пользователя и отображает сообщение: «Что-то пошло не так. Попробуйте перезагрузить». (См. прикрепленный скриншот).
Изображение

Что я пробовал
  • Автоматизация входа: Сценарий входа работает нормально, и я могу перемещаться по сайту. на страницу пользователя.
  • Сканирование твитов. Мой скрипт сканирует первые три твита, поскольку я не смог найти надежный способ программного пропуска закрепленных твитов и ретвитов.
  • Избегание Twitter API: Я избегаю использования API из-за его ограничений и стоимости бесплатного уровня.
  • Сведение к минимуму обнаружения ботов: Я добавили задержки, рандомизированные делает паузу и пробовал различные варианты Selenium, чтобы сделать бота менее заметным, но проблема сохраняется после нескольких обновлений страницы.
В чем мне нужна помощь
  • Лучшая логика для пропуска закрепленных и ретвитированных твитов:
    Есть ли надежный способ идентифицировать и исключить эти твиты, в идеале, не полагаясь исключительно на CSS селекторы?
  • Предотвращение блокировки страниц Twitter:
    Как я могу запретить Twitter блокировать просмотр сообщений пользователя после нескольких обновлений ?
  • Могу ли я внести изменения в свой сценарий Selenium?
    Должен ли я использовать прокси, менять пользовательских агентов или реализовать другие методы минимизации обнаружения?
  • Изучение альтернатив Selenium:
    Могут ли такие инструменты, как BeautifulSoup, Scrapy или другие библиотеки Python, лучше подойти для очистки твитов без обнаружения? Я готов сменить метод, если есть более надежное решение.
  • Общие советы по предотвращению обнаружения:
    Какие из них лучше? методы создания парсера, который избегает обнаружения при взаимодействии с такими сайтами, как Twitter?
Дополнительный контекст >
  • Я использую Selenium для этого проекта, но я открыт для изучения альтернатив. Моя основная цель — надежно собирать и печатать твиты, исключая дубликаты и избегая при этом обнаружения или блокировки.
  • Я понимаю условия обслуживания Twitter в отношении парсинг и постарайтесь использовать его ответственно.
Вот код, который я сделал для ротации
Любые рекомендации по улучшению текущего подхода или переходу на лучший метод буду очень признателен!

Подробнее здесь: https://stackoverflow.com/questions/793 ... sing-selen
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»