如何从推特上抓取所有主题
Posted
技术标签:
【中文标题】如何从推特上抓取所有主题【英文标题】:How to scrape all topics from twitter 【发布时间】:2020-11-12 01:48:38 【问题描述】:推特上的所有话题都可以在这个link找到 我想用里面的每个子类别刮掉所有这些。
BeautifulSoup 在这里似乎没有用。我尝试使用 selenium,但我不知道如何匹配单击主类别后出现的 Xpath。
from selenium import webdriver
from selenium.common import exceptions
url = 'https://twitter.com/i/flow/topics_selector'
driver = webdriver.Chrome('absolute path to chromedriver')
driver.get(url)
driver.maximize_window()
main_topics = driver.find_elements_by_xpath('/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div/span')
topics =
for main_topic in main_topics[2:]:
print(main_topic.text.strip())
topics[main_topic.text.strip()] =
我知道我可以使用main_topics[3].click()
单击主类别,但我不知道如何才能递归地单击它们,直到我只找到右侧带有Follow
的类别。
【问题讨论】:
下面的答案对你有好处吗? 不,它给出了超时错误,而且它没有包含存储主题名称的代码,它只关注点击主题和子主题。 好的,我看看我能做什么 好的,谢谢您的关心。真的很感激。 我不使用 twitter。当我打开你的页面时,它什么也没显示。 【参考方案1】:看看XPATH 是如何工作的。只需输入 '//element[@attribute="foo"]' 就不必写出整个路径。请注意,主要主题和子主题(单击主要主题后可见)具有相同的类名。那是导致错误的原因。所以,这就是我能够点击子主题的方法,但我相信还有更好的方法:
我使用以下方法找到了主题元素:
topics = WebDriverWait(browser, 5).until(
EC.presence_of_all_elements_located((By.XPATH, '//div[@class="css-901oao r-13gxpu9 r-1qd0xha r-1b6yd1w r-1vr29t4 r-ad9z0x r-bcqeeo r-qvutc0"]'))
)
然后我创建了一个名为:
main_topics = []
然后,我 for 循环遍历主题并将每个 element.text 附加到 main_topics 列表中,然后单击每个元素以显示主要主题。
for topic in topics:
main_topics.append(topic.text)
topic.click()
然后,我创建了一个名为 sub_topics 的新变量:(现在是所有打开的主题)
sub_topics = WebDriverWait(browser, 5).until(
EC.presence_of_all_elements_located((By.XPATH, '//span[@class="css-901oao css-16my406 r-1qd0xha r-ad9z0x r-bcqeeo r-qvutc0"]'))
)
然后,我创建了另外两个名为:
subs_list = []
skip_these_words = ["Done", "Follow your favorite Topics", "You’ll see top Tweets about them in your timeline. Don’t see your favorite Topics yet? New Topics are added every week.", "Follow"]
]
然后,我 for 循环遍历 sub_topics 并做了一个 if 语句,仅当 elements.text 不在 main_topics 和 skip_these_words 列表中时才将它们附加到 subs_list 中。我这样做是为了过滤掉顶部的主要主题和不必要的文本,因为所有这些 dern 元素都具有相同的类名。最后,点击每个子主题。最后一部分令人困惑,所以这里有一个例子:
for sub in sub_topics:
if sub.text not in main_topics and sub.text not in skip_these_words:
subs_list.append(sub.text)
sub.click()
还有一些隐藏的子子主题。看看是否可以点击剩余的子子主题。然后,看看你是否能找到跟随按钮元素并点击每一个。
【讨论】:
EC.presence_of_all_elements_located
给出超时异常
你试过增加参数吗?也许将其更改为...WebDriverWait(browser, 10)
@Dragonthoughts 它确实可以帮助我点击主题按钮,但是在点击低于该级别的按钮时会出错。
@KevinThomas 没有找到哪个元素?或者你能把错误贴在这里吗?我从来没有遇到过超时问题。【参考方案2】:
抓取所有主要主题,例如艺术与文化、商业与金融等使用Selenium和python你必须诱导WebDriverWait为visibility_of_all_elements_located()
,你可以使用以下任一Locator Strategies:
使用XPATH
和text属性:
driver.get("https://twitter.com/i/flow/topics_selector")
print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//span[contains(., 'see top Tweets about them in your timeline')]//following::div[@role='button']/div/span")))])
使用XPATH
和get_attribute()
:
driver.get("https://twitter.com/i/flow/topics_selector")
print([my_elem.get_attribute("textContent") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//span[contains(., 'see top Tweets about them in your timeline')]//following::div[@role='button']/div/span")))])
控制台输出:
['Arts & culture', 'Business & finance', 'Careers', 'Entertainment', 'Fashion & beauty', 'Food', 'Gaming', 'Lifestyle', 'Movies and TV', 'Music', 'News', 'Outdoors', 'Science', 'Sports', 'Technology', 'Travel']
要使用 Selenium 和 WebDriver 抓取所有 main 和 子主题,您可以使用以下命令定位策略:
使用XPATH
和get_attribute("textContent")
:
driver.get("https://twitter.com/i/flow/topics_selector")
elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//span[contains(., 'see top Tweets about them in your timeline')]//following::div[@role='button']/div/span")))
for element in elements:
element.click()
print([my_elem.get_attribute("textContent") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@role='button']/div/span[text()]")))])
driver.quit()
控制台输出:
['Arts & culture', 'Animation', 'Art', 'Books', 'Dance', 'Horoscope', 'Theater', 'Writing', 'Business & finance', 'Business personalities', 'Business professions', 'Cryptocurrencies', 'Careers', 'Education', 'Fields of study', 'Entertainment', 'Celebrities', 'Comedy', 'Digital creators', 'Entertainment brands', 'Podcasts', 'Popular franchises', 'Theater', 'Fashion & beauty', 'Beauty', 'Fashion', 'Food', 'Cooking', 'Cuisines', 'Gaming', 'Esports', 'Game development', 'Gaming hardware', 'Gaming personalities', 'Tabletop gaming', 'Video games', 'Lifestyle', 'Animals', 'At home', 'Collectibles', 'Family', 'Fitness', 'Unexplained phenomena', 'Movies and TV', 'Movies', 'Television', 'Music', 'Alternative', 'Bollywood music', 'C-pop', 'Classical music', 'Country music', 'Dance music', 'Electronic music', 'Hip-hop & rap', 'J-pop', 'K-hip hop', 'K-pop', 'Metal', 'Musical instruments', 'Pop', 'R&B and soul', 'Radio stations', 'Reggae', 'Reggaeton', 'Rock', 'World music', 'News', 'COVID-19', 'Local news', 'Social movements', 'Outdoors', 'Science', 'Biology', 'Sports', 'American football', 'Australian rules football', 'Auto racing', 'Baseball', 'Basketball', 'Combat Sports', 'Cricket', 'Extreme sports', 'Fantasy sports', 'Football', 'Golf', 'Gymnastics', 'Hockey', 'Lacrosse', 'Pub sports', 'Rugby', 'Sports icons', 'Sports journalists & coaches', 'Tennis', 'Track & field', 'Water sports', 'Winter sports', 'Technology', 'Computer programming', 'Cryptocurrencies', 'Data science', 'Information security', 'Operating system', 'Tech brands', 'Tech personalities', 'Travel', 'Adventure travel', 'Destinations', 'Transportation']
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
【讨论】:
出色的工作做得很好,我也在研究这个问题的解决方案,我喜欢你为主要主题处理 Xpath 的方式,干得好。以上是关于如何从推特上抓取所有主题的主要内容,如果未能解决你的问题,请参考以下文章