Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой степени работает, я столкнулся с проблемами обнаружения ботов и блокировкой страниц после нескольких обновлений.
Хотя я написал код с использованием Selenium, я рад изучить другие методы (такие как BeautifulSoup, Scrapy или любая другая библиотека Python), если они могут более эффективно достичь моей цели и свести к минимуму обнаружение. Моя цельСценарий должен:
Автоматический вход в Twitter.
Перейдите к профилю конкретного пользователя (в данном случае Фабрицио Романо: https://twitter.com). /FabrizioRomano).
Захватывайте и распечатывайте последние твиты со страницы.
Избегайте печати одного и того же твита несколько раз, даже если он появляется снова после появления нового. твиты удаляются.
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 в отношении парсинг и постарайтесь использовать его ответственно.
Вот код, который я сделал для ротации
Любые рекомендации по улучшению текущего подхода или переходу на лучший метод буду очень признателен!
Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой степени работает, я столкнулся с проблемами обнаружения ботов и блокировкой страниц после нескольких обновлений. Хотя я написал код с использованием Selenium, я рад изучить другие методы (такие как BeautifulSoup, Scrapy или любая другая библиотека Python), если они могут более эффективно достичь моей цели и свести к минимуму обнаружение. [b]Моя цель[/b]Сценарий должен: [list] [*]Автоматический вход в Twitter. [*]Перейдите к профилю конкретного пользователя (в данном случае Фабрицио Романо: https://twitter.com). /FabrizioRomano). [*]Захватывайте и распечатывайте последние твиты со страницы. [*]Избегайте печати одного и того же твита несколько раз, даже если он появляется снова после появления нового. твиты удаляются. [*]Исключить закрепленные твиты и репосты (ретвиты). [/list] Вот скрипт, который я написал с помощью Selenium: [code]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}")
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
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() [/code] [b]Текущие проблемы[/b] Мой скрипт сканирует первые три твита после каждого обновления, но не может надежно исключить закрепленные твиты и ретвиты с помощью Только CSS-селекторы. Это приводит к тому, что ранее напечатанные твиты появляются снова, когда новые твиты удаляются. Я хочу, чтобы сценарий гарантировал, что ни один твит не будет напечатан более одного раза, даже если он появится позже. Например, если исходными твитами являются Tweet1, Tweet2 и Tweet3, сценарий должен вывести Tweet1. Если после обновления твиты изменятся на Tweet2, Tweet4 и Tweet5, сценарий должен напечатать Tweet2. Если при следующем обновлении отображаются Tweet1, Tweet4 и Tweet5, сценарий не должен перепечатывать Tweet1. Кроме того, после нескольких обновлений страницы Twitter блокирует просмотр сообщений пользователя и отображает сообщение: «Что-то пошло не так. Попробуйте перезагрузить». (См. прикрепленный скриншот). [img]https://i.sstatic.net/DdZ563j4.png[/img]
Что я пробовал [list] [*][b]Автоматизация входа:[/b] Сценарий входа работает нормально, и я могу перемещаться по сайту. на страницу пользователя. [*][b]Сканирование твитов.[/b] Мой скрипт сканирует первые три твита, поскольку я не смог найти надежный способ программного пропуска закрепленных твитов и ретвитов. [*] [b]Избегание Twitter API:[/b] Я избегаю использования API из-за его ограничений и стоимости бесплатного уровня. [*][b]Сведение к минимуму обнаружения ботов:[/b] Я добавили задержки, рандомизированные делает паузу и пробовал различные варианты Selenium, чтобы сделать бота менее заметным, но проблема сохраняется после нескольких обновлений страницы. [/list] [b]В чем мне нужна помощь [/b] [list] [*]Лучшая логика для пропуска закрепленных и ретвитированных твитов: Есть ли надежный способ идентифицировать и исключить эти твиты, в идеале, не полагаясь исключительно на CSS селекторы?
[*]Предотвращение блокировки страниц Twitter: Как я могу запретить Twitter блокировать просмотр сообщений пользователя после нескольких обновлений ?
[*]Могу ли я внести изменения в свой сценарий Selenium? Должен ли я использовать прокси, менять пользовательских агентов или реализовать другие методы минимизации обнаружения?
[*]Изучение альтернатив Selenium: Могут ли такие инструменты, как BeautifulSoup, Scrapy или другие библиотеки Python, лучше подойти для очистки твитов без обнаружения? Я готов сменить метод, если есть более надежное решение.
[*]Общие советы по предотвращению обнаружения: Какие из них лучше? методы создания парсера, который избегает обнаружения при взаимодействии с такими сайтами, как Twitter?
[/list] [b]Дополнительный контекст[/b] > [list] [*]Я использую Selenium для этого проекта, но я открыт для изучения альтернатив. Моя основная цель — надежно собирать и печатать твиты, исключая дубликаты и избегая при этом обнаружения или блокировки.
[*]Я понимаю условия обслуживания Twitter в отношении парсинг и постарайтесь использовать его ответственно.
[/list] Вот код, который я сделал для ротации Любые рекомендации по улучшению текущего подхода или переходу на лучший метод буду очень признателен!
Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой...
Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой...
Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой...
Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой...
Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой...