Я пытаюсь получить новые твиты из учетной записи Twitter с помощью Selenium (я не уверен, что селен — лучший способ сделать это). Мой скрипт входит в Twitter, переходит к профилю пользователя и записывает последние твиты. Хотя Selenium в некоторой степени работает, я столкнулся с проблемами обнаружения ботов и блокировкой страниц после нескольких обновлений.
Хотя я написал код с использованием Selenium, я рад изучить другие методы (такие как BeautifulSoup, Scrapy или любая другая библиотека Python), если они могут более эффективно достичь моей цели и свести к минимуму обнаружение. Моя цельСценарий должен:
Автоматический вход в Twitter.
Перейдите к профилю конкретного пользователя (в данном случае Фабрицио Романо: https://twitter.com). /FabrizioRomano).
Захватывайте и распечатывайте последние твиты со страницы.
Избегайте печати одного и того же твита несколько раз, даже если он появляется снова после появления нового. твиты удаляются.
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import configparser
import time
import random
from datetime import datetime
class TwitterScraper:
def __init__(self):
# Set up the Selenium WebDriver with Chrome options
options = Options()
options.add_argument("--headless") # Use headless mode
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("--disable-web-security")
options.add_argument("--incognito")
options.add_argument("--lang=en-US")
options.add_argument("--window-size=1920,1080")
options.add_argument(
"user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
)
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
self.driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()), options=options
)
self.printed_tweets = set() # Track all 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(Keys.ENTER)
time.sleep(3) # Adjusted wait time after entering email
# 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(Keys.ENTER)
time.sleep(3) # Adjusted wait time after entering username
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(Keys.ENTER)
time.sleep(5) # Adjusted wait time after entering password
print("Login successful.")
except Exception as e:
print(f"Error during login: {e}")
self.driver.quit()
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)) # Adjusted delay
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
if len(tweet.find_elements(By.CSS_SELECTOR, 'svg[aria-label="Pinned Tweet"]')) > 0:
continue
# Skip retweets/reposts
if len(tweet.find_elements(By.CSS_SELECTOR, 'svg[aria-label="Retweet"]')) > 0:
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):
self.login()
self.navigate_to_page("FabrizioRomano")
while True:
recent_tweets = self.get_recent_tweets(num_tweets=3)
if recent_tweets:
newest_time, newest_tweet = max(recent_tweets, key=lambda x: x[0]) # Find newest tweet
# Only print if it's not in printed_tweets
if newest_tweet not in self.printed_tweets:
print("Newest Tweet:")
print(f"Tweeted at {newest_time}:")
print(newest_tweet)
self.printed_tweets.add(newest_tweet) # Add to printed tweets
time.sleep(random.uniform(5, 8)) # Adjusted delay
self.driver.refresh()
def quit(self):
self.driver.quit()
if __name__ == "__main__":
bot = TwitterScraper()
bot.start()
Текущие проблемы
Мой скрипт сканирует первые три твита после каждого обновления, но не может надежно исключить закрепленные твиты и ретвиты с помощью Только CSS-селекторы. Это приводит к тому, что ранее напечатанные твиты появляются снова, когда новые твиты удаляются. Я хочу, чтобы сценарий гарантировал, что ни один твит не будет напечатан более одного раза, даже если он появится позже. Например, если исходными твитами являются Tweet1, Tweet2 и Tweet3, сценарий должен вывести Tweet1. Если после обновления твиты изменятся на Tweet2, Tweet4 и Tweet5, сценарий должен напечатать Tweet2. Если при следующем обновлении отображаются Tweet1, Tweet4 и Tweet5, сценарий не должен перепечатывать Tweet1. Кроме того, после нескольких обновлений страницы Twitter блокирует просмотр сообщений пользователя и отображает сообщение: «Что-то пошло не так. Попробуйте перезагрузить». (См. прикрепленный скриншот).
Что я пробовал
Автоматизация входа: Сценарий входа работает нормально, и я могу перемещаться по сайту. на страницу пользователя.
Сканирование твитов. Мой скрипт сканирует первые три твита, поскольку я не смог найти надежный способ программного пропуска закрепленных твитов и ретвитов.
Избегаем API Twitter: Я избегаю использования 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]from selenium import webdriver from selenium.webdriver import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager import configparser import time import random from datetime import datetime
class TwitterScraper: def __init__(self): # Set up the Selenium WebDriver with Chrome options options = Options() options.add_argument("--headless") # Use headless mode 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("--disable-web-security") options.add_argument("--incognito") options.add_argument("--lang=en-US") options.add_argument("--window-size=1920,1080") options.add_argument( "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" ) options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False)
# Only print if it's not in printed_tweets if newest_tweet not in self.printed_tweets: print("Newest Tweet:") print(f"Tweeted at {newest_time}:") print(newest_tweet) self.printed_tweets.add(newest_tweet) # Add to printed tweets
if __name__ == "__main__": bot = TwitterScraper() bot.start() [/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]Избегаем API Twitter:[/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 в некоторой...