python - 如何从《纽约时报》中抓取特定类别的所有文章

标签 python web-scraping beautifulsoup

我需要能够从《纽约时报》中抓取特定类别的许多文章的内容。例如,假设我们想查看所有与“恐怖主义”相关的文章。我会转到此链接查看所有文章: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/

相关文章:

android - 我们如何为基于 python 的应用程序创建 android apk

python - 使用 beautifulsoup 解析带有一些文本的标签

python - 用 python 抓取 .aspx 页面

python - BeautifulSoup - 组合连续的标签

python - 使用 br.submit() 时无法通过 Mechanize 获得正确的结果

python - pandas:如何将嵌套 JSON 解包为数据帧?

python - 如何将 Flask 应用程序作为包部署到 App Engine?

python - 嵌套的 django 模板标签

xpath - 使用 CasperJS 在 youtube 评论上查找 XPath 以获取点赞按钮

python - 异步网络抓取 101 : fetching multiple urls with aiohttp