我需要能够从《纽约时报》中抓取特定类别的许多文章的内容。例如,假设我们想查看所有与“恐怖主义”相关的文章。我会转到此链接查看所有文章:https://www.nytimes.com/topic/subject/terrorism
从这里,我可以单击各个链接,该链接会将我定向到可以抓取的 URL。我使用 Python 和 BeautifulSoup 包来帮助我检索文章文本。
这是我迄今为止拥有的代码,它可以让我从一篇特定文章中抓取所有文本:
from bs4 import BeautifulSoup
session = requests.Session()
url = "https://www.nytimes.com/2019/10/23/world/middleeast/what-is-going-to-happen-to-us-inside-isis-prison-children-ask-their-fate.html"
req = session.get(url)
soup = BeautifulSoup(req.text, 'html.parser')
paragraphs = soup.find_all('p')
for p in paragraphs:
print(p.get_text())
问题是,我需要能够抓取该类别下的所有这些文章,但我不知道该怎么做。由于只要给定 URL,我就可以抓取一篇文章,因此我假设下一步是找到一种方法来收集此特定类别下的所有 URL,然后对每个 URL 运行上面的代码。我该如何做到这一点,特别是考虑到页面的格式?如果查看更多文章的唯一方法是手动选择列表底部的“显示更多”按钮,我该怎么办? BeautifulSoup 中包含这些功能吗?
最佳答案
您可能想要限制一次要提取的文章数量。我多次点击恐怖主义类别的“显示更多”按钮,而且它一直持续下去。
要查找链接,您需要分析 html 结构并查找模式。在这种情况下,每个文章预览都位于 class =“css-13mho3u”的列表元素中。但是我检查了另一个类别,这个类模式与其他类别不一致。但您可以看到这些列表元素都位于 class = "polite"的有序列表元素下,这与其他新闻类别一致。
在每个列表类别下,都有一个链接到该文章的链接。所以你只需捕获它并提取 href 即可。您的代码可能如下所示:
ol = soup.find('ol', {'class':'polite'})
lists = ol.findAll('li')
for list in lists:
link = list.find('a')
url = link['href']
要单击“显示更多”按钮,您需要使用 beautiful soup 之外的其他工具。您可以使用 Selenium webdriver 单击它来打开下一页。您可以按照最上面的答案this SO question学习这样做。
关于python - 如何从《纽约时报》中抓取特定类别的所有文章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58712886/