使用Selenium和Python解析Twitter
我刚开始用selenium做网页解析。 我有一个任务:“你需要获取埃隆·马斯克最近的10条推文,并在终端上显示它们的内容。” 我试着这样做:
import os
from selenium.webdriver.common.by import By
from selenium_stealth import stealth
from seleniumwire import webdriver
from dotenv import load_dotenv
load_dotenv()
LOGIN = os.getenv('LOGIN')
PASSWORD = os.getenv('PASSWORD')
IP_ADRESS = os.getenv('FR_IP_ADRESS')
PORT = os.getenv('FR_PORT')
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument('--ignore-certificate-errors')
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
proxy_options = {
'proxy': {
'http': f'http://{LOGIN}:{PASSWORD}@{IP_ADRESS}:{PORT}'
}
}
try:
link = 'https://twitter.com/elonmusk'
browser = webdriver.Chrome(
options=options,
seleniumwire_options=proxy_options
)
stealth(
browser,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
browser.get(link)
browser.implicitly_wait(20)
target = browser.find_elements(
By.CSS_SELECTOR, '[data-testid="tweet"]'
)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
twits = browser.find_elements(
By.CSS_SELECTOR, '[data-testid="tweet"] [data-testid="tweetText"]'
)
for twit in twits[::10]:
print(twit.text)
finally:
time.sleep(20)
browser.quit()
第一个问题是,滚动网页的代码 browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
不起作用,但我在代码的第一个版本中用它时是正常的。
第二个问题是,我的推文收集器要么什么都不收集,要么每次收集到的内容都不一样。
我尝试了不同的滚动方法,但它们要么有效,要么无效。推文收集器的情况也是类似。
我觉得问题可能和推特的工作方式有关,但我不太确定,因为我在解析方面的经验还不够。
希望你们能帮我。
提前谢谢你们!
1 个回答
0
由于selenium找不到元素,我们可以把HTML内容传给BeautifulSoup来提取推文的文本。
下面是获取前10条推文文本的完整脚本。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
options = Options()
#options.add_argument("user-data-dir=C:\\Users\\yourusername\\AppData\\Local\\Google\\Chrome Beta\\User Data")
options.add_argument("profile-directory=Default")
driver_service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=driver_service, options=options)
try:
link = 'https://twitter.com/elonmusk'
driver.get(link)
tweet_text_elements = []
# Scroll 5 times to load more tweets
for _ in range(5):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(2)
html_content = driver.page_source
soup = BeautifulSoup(html_content, 'html.parser')
# Find all elements with 'tweetText'
tweet_text_elements.extend(soup.find_all('div', {'data-testid': 'tweetText'}))
# first 10 tweet
for i, tweet_text_element in enumerate(tweet_text_elements[:10]):
tweet_text = tweet_text_element.text.strip().replace("\n", "")
print(f"Tweet {i+1}: {tweet_text}")
finally:
driver. Quit()