Ich versuche, mit Selen neue Tweets von einem Twitter-Konto zu extrahieren (ich bin mir nicht sicher, ob Selen dafür der beste Weg ist). Mein Skript meldet sich bei Twitter an, navigiert zum Profil des Benutzers und erfasst die neuesten Tweets. Während Selenium bis zu einem gewissen Grad funktioniert, sind bei mir nach mehreren Aktualisierungen Probleme mit der Bot-Erkennung und dem Blockieren von Seiten aufgetreten.
Obwohl ich den Code mit Selenium geschrieben habe, freue ich mich, andere zu erkunden Methoden (wie BeautifulSoup, Scrapy oder jede andere Python-Bibliothek), wenn sie mein Ziel effektiver erreichen und die Erkennung minimieren können. Mein ZielDas Skript sollte:
Automatisch bei Twitter anmelden.
Navigieren Sie zum Profil eines bestimmten Benutzers (in diesem Fall Fabrizio Romano: https://twitter.com /FabrizioRomano).
Erfassen und drucken Sie die neuesten Tweets von der Seite.
Vermeiden Sie es, denselben Tweet mehrmals zu drucken, auch wenn er nach neueren erneut erscheint Tweets werden gelöscht.
Angeheftete Tweets und Reposts (Retweets) ausschließen.
Hier ist das Skript, das ich mit Selenium geschrieben habe:
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()
Aktuelle Probleme
Mein Skript scannt die ersten drei Tweets nach jeder Aktualisierung, kann angeheftete Tweets und Retweets jedoch nicht zuverlässig ausschließen Nur CSS-Selektoren. Dies führt dazu, dass zuvor gedruckte Tweets wieder angezeigt werden, wenn neuere Tweets gelöscht werden. Ich möchte, dass das Skript sicherstellt, dass kein Tweet mehr als einmal gedruckt wird, auch wenn er später wieder erscheint. Wenn die ersten Tweets beispielsweise Tweet1, Tweet2 und Tweet3 lauten, sollte das Skript Tweet1 ausgeben. Wenn sich die Tweets nach einer Aktualisierung in Tweet2, Tweet4 und Tweet5 ändern, sollte das Skript Tweet2 ausgeben. Wenn bei einer weiteren Aktualisierung Tweet1, Tweet4 und Tweet5 angezeigt werden, sollte das Skript Tweet1 nicht erneut drucken. Außerdem blockiert Twitter nach mehrmaligem Aktualisieren der Seite meine Sicht auf die Beiträge des Benutzers und zeigt die Meldung an: „Etwas ist schief gelaufen. Versuchen Sie es neu zu laden.“ (Siehe beigefügten Screenshot).
Was ich versucht habe
Anmeldeautomatisierung: Das Anmeldeskript funktioniert einwandfrei und ich kann navigieren zur Seite des Benutzers.
Tweet Scannen: Mein Skript scannt die ersten drei Tweets, weil ich keine zuverlässige Möglichkeit gefunden habe, angeheftete Tweets und Retweets programmgesteuert zu überspringen.
Twitter-API vermeiden:< /strong>Ich habe die API aufgrund der Einschränkungen und Kosten des kostenlosen Kontingents gemieden.
Bot-Erkennung minimieren: Ich habe Verzögerungen, zufällige Pausen usw. hinzugefügt habe verschiedene Selenium-Optionen ausprobiert, um den Bot herzustellen weniger erkennbar, aber das Problem besteht auch nach mehreren Seitenaktualisierungen weiterhin.
Wobei ich Hilfe benötige
Bessere Logik zum Überspringen angepinnter und retweeteter Tweets:
Gibt es eine zuverlässige Möglichkeit, diese Tweets zu identifizieren und auszuschließen, idealerweise ohne sich ausschließlich auf CSS-Selektoren zu verlassen?
Seitenblockierungen durch Twitter verhindern:
Wie kann ich verhindern, dass Twitter meine Ansicht der Beiträge des Benutzers nach mehreren Aktualisierungen blockiert?
Gibt es Anpassungen, die ich an meinem Selenium-Skript vornehmen kann?
Soll ich Proxys verwenden, Benutzeragenten rotieren oder andere Techniken implementieren, um die Erkennung zu minimieren?
Erforschung von Alternativen zu Selenium:
Würden Tools wie BeautifulSoup, Scrapy oder andere Python-Bibliotheken besser zum Scraping von Tweets ohne Erkennung geeignet sein? Ich bin offen für einen Methodenwechsel, wenn es eine robustere Lösung gibt.
Allgemeine Ratschläge zur Vermeidung von Erkennung:
Welche sind die besten? Praktiken zum Erstellen eines Scrapers, der die Erkennung bei der Interaktion mit Websites wie Twitter vermeidet?
Zusätzlicher Kontext
Ich verwende Selen für dieses Projekt, bin aber offen für die Erkundung von Alternativen. Mein Hauptziel ist es, Tweets zuverlässig zu scannen und zu drucken, um sicherzustellen, dass keine Duplikate entstehen und gleichzeitig Erkennung oder Blockierung vermieden werden.
Ich verstehe die Nutzungsbedingungen von Twitter bezüglich Scraping und versuche, damit verantwortungsvoll umzugehen.
Hier ist der Code, den ich zum Rotieren erstellt habe
Jede Anleitung zur Verbesserung des aktuellen Ansatzes oder zum Wechsel zu einer besseren Methode wäre sehr hilfreich geschätzt!
Ich versuche, mit Selen neue Tweets von einem Twitter-Konto zu extrahieren (ich bin mir nicht sicher, ob Selen dafür der beste Weg ist). Mein Skript meldet sich bei Twitter an, navigiert zum Profil des Benutzers und erfasst die neuesten Tweets. Während Selenium bis zu einem gewissen Grad funktioniert, sind bei mir nach mehreren Aktualisierungen Probleme mit der Bot-Erkennung und dem Blockieren von Seiten aufgetreten. Obwohl ich den Code mit Selenium geschrieben habe, freue ich mich, andere zu erkunden Methoden (wie BeautifulSoup, Scrapy oder jede andere Python-Bibliothek), wenn sie mein Ziel effektiver erreichen und die Erkennung minimieren können. [b]Mein Ziel[/b]Das Skript sollte: [list] [*]Automatisch bei Twitter anmelden. [*]Navigieren Sie zum Profil eines bestimmten Benutzers (in diesem Fall Fabrizio Romano: https://twitter.com /FabrizioRomano). [*]Erfassen und drucken Sie die neuesten Tweets von der Seite. [*]Vermeiden Sie es, denselben Tweet mehrmals zu drucken, auch wenn er nach neueren erneut erscheint Tweets werden gelöscht. [*]Angeheftete Tweets und Reposts (Retweets) ausschließen. [/list] Hier ist das Skript, das ich mit Selenium geschrieben habe: [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]Aktuelle Probleme[/b] Mein Skript scannt die ersten drei Tweets nach jeder Aktualisierung, kann angeheftete Tweets und Retweets jedoch nicht zuverlässig ausschließen Nur CSS-Selektoren. Dies führt dazu, dass zuvor gedruckte Tweets wieder angezeigt werden, wenn neuere Tweets gelöscht werden. Ich möchte, dass das Skript sicherstellt, dass kein Tweet mehr als einmal gedruckt wird, auch wenn er später wieder erscheint. Wenn die ersten Tweets beispielsweise Tweet1, Tweet2 und Tweet3 lauten, sollte das Skript Tweet1 ausgeben. Wenn sich die Tweets nach einer Aktualisierung in Tweet2, Tweet4 und Tweet5 ändern, sollte das Skript Tweet2 ausgeben. Wenn bei einer weiteren Aktualisierung Tweet1, Tweet4 und Tweet5 angezeigt werden, sollte das Skript Tweet1 nicht erneut drucken. Außerdem blockiert Twitter nach mehrmaligem Aktualisieren der Seite meine Sicht auf die Beiträge des Benutzers und zeigt die Meldung an: „Etwas ist schief gelaufen. Versuchen Sie es neu zu laden.“ (Siehe beigefügten Screenshot). [img]https://i.sstatic.net/DdZ563j4.png[/img]
Was ich versucht habe [list] [*][b]Anmeldeautomatisierung:[/b] Das Anmeldeskript funktioniert einwandfrei und ich kann navigieren zur Seite des Benutzers. [*][b]Tweet Scannen:[/b] Mein Skript scannt die ersten drei Tweets, weil ich keine zuverlässige Möglichkeit gefunden habe, angeheftete Tweets und Retweets programmgesteuert zu überspringen. [*][b]Twitter-API vermeiden:< /strong>Ich habe die API aufgrund der Einschränkungen und Kosten des kostenlosen Kontingents gemieden. [*]Bot-Erkennung minimieren:[/b] Ich habe Verzögerungen, zufällige Pausen usw. hinzugefügt habe verschiedene Selenium-Optionen ausprobiert, um den Bot herzustellen weniger erkennbar, aber das Problem besteht auch nach mehreren Seitenaktualisierungen weiterhin. [/list] [b]Wobei ich Hilfe benötige[/b] [list] [*]Bessere Logik zum Überspringen angepinnter und retweeteter Tweets: Gibt es eine zuverlässige Möglichkeit, diese Tweets zu identifizieren und auszuschließen, idealerweise ohne sich ausschließlich auf CSS-Selektoren zu verlassen?
[*]Seitenblockierungen durch Twitter verhindern: Wie kann ich verhindern, dass Twitter meine Ansicht der Beiträge des Benutzers nach mehreren Aktualisierungen blockiert?
[*]Gibt es Anpassungen, die ich an meinem Selenium-Skript vornehmen kann? Soll ich Proxys verwenden, Benutzeragenten rotieren oder andere Techniken implementieren, um die Erkennung zu minimieren?
Erforschung von Alternativen zu Selenium: Würden Tools wie BeautifulSoup, Scrapy oder andere Python-Bibliotheken besser zum Scraping von Tweets ohne Erkennung geeignet sein? Ich bin offen für einen Methodenwechsel, wenn es eine robustere Lösung gibt.
[*]Allgemeine Ratschläge zur Vermeidung von Erkennung: Welche sind die besten? Praktiken zum Erstellen eines Scrapers, der die Erkennung bei der Interaktion mit Websites wie Twitter vermeidet?
[/list] Zusätzlicher Kontext [list] [*]Ich verwende Selen für dieses Projekt, bin aber offen für die Erkundung von Alternativen. Mein Hauptziel ist es, Tweets zuverlässig zu scannen und zu drucken, um sicherzustellen, dass keine Duplikate entstehen und gleichzeitig Erkennung oder Blockierung vermieden werden.
[*]Ich verstehe die Nutzungsbedingungen von Twitter bezüglich Scraping und versuche, damit verantwortungsvoll umzugehen.
[/list] Hier ist der Code, den ich zum Rotieren erstellt habe Jede Anleitung zur Verbesserung des aktuellen Ansatzes oder zum Wechsel zu einer besseren Methode wäre sehr hilfreich geschätzt!
Ich habe immer noch keine Antwort auf dieses Problem gefunden, ich werde deswegen verrückt werden. Bitte helfen Sie jemandem, der weiß, wie ich Duplikate verhindern kann, wenn ich eine CSV-Datei mit...
Ich arbeite an einem Gradle-Projekt, in dem ich Artefakte mithilfe der Maven-Veröffentlichung in einem JFrog Artifactory-Repository veröffentliche (dieses Repository ist ein generisches Repository,...
Ich schaffe es anscheinend nicht, in diesem Diagramm die Spalte „Gewicht“ geordnet anzuzeigen. Die alphabetische Sortierung der Spalte „Rasse“ wird priorisiert, obwohl ich „Gewicht“ zu einer...