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

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

Сообщение Anonymous »

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

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

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 в отношении парсинг и постарайтесь использовать его ответственно.
Любые рекомендации по улучшению текущего подхода или переходу на лучший метод будут очень признателен!

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

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

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

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

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

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

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