【发布时间】:2020-05-06 21:05:52
【问题描述】:
这可能看起来像一个重复的问题,但相信我,我在 twitter 上观察到了一些新的东西。
我之前制作了一个推特抓取工具,它使用滚动和等待动态元素来获取给定数量的推文。但它现在似乎不起作用。它不会抓取超过 10 条推文。此外,它抓取的推文只是最后 10 条推文(在我最初通过滚动加载的所有推文中)
这个函数应该抓取至少 n 条推文。一开始大约有 10 条推文出现。所以我滚动页面n/10-1 次以加载所有 n 条推文。然后我用特定的类名刮掉所有的 div。
def get_n_tweets(n, search_str='Covid 19'):
driver = webdriver.Firefox(executable_path='geckodriver.exe')
driver.get("http://twitter.com/search?q=" + search_str + "&src=typd")
response = []
for x in range(math.ceil(n / 10)-1):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
try:
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div[class='css-1dbjc4n r-1iusvr4 r-16y2uox r-1777fci r-5f2r5o r-1mi0q7o']"))
)
e_tweets = driver.find_elements(By.CSS_SELECTOR, "div[class='css-1dbjc4n r-1iusvr4 r-16y2uox r-1777fci r-5f2r5o r-1mi0q7o']")
for e_tweet in e_tweets:
e_fullname = e_tweet.find_element(By.CSS_SELECTOR, "div>span[class='css-901oao css-16my406 r-1qd0xha r-ad9z0x r-bcqeeo r-qvutc0']")
e_tweet_text = e_tweet.find_element(By.CSS_SELECTOR, "div[class='css-901oao r-hkyrab r-1qd0xha r-a023e6 r-16dba41 r-ad9z0x r-bcqeeo r-bnwqim r-qvutc0']")
response.append({'by': e_fullname.text,
'tweet': e_tweet_text.text,
'score': TextBlob(e_tweet_text.text).sentiment.polarity})
finally:
driver.quit()
return response
我尝试了什么? 我尝试通过滚动到页面底部来加载所需的尽可能多的推文,然后向上滚动到页面的开头,然后获取所需的元素。这给出了 StaleElementError。
我怀疑这是造成这种情况的原因: 在网页中,当我向下滚动以加载指定数量的推文然后返回页面顶部时,我之前加载的推文消失了。
我正在寻找一种简单而标准的方法来解决这个问题。任何帮助将不胜感激!
【问题讨论】:
标签: python-3.x selenium-webdriver web-scraping