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



我需要能够从《纽约时报》上抓取许多特定类别文章的内容。例如,假设我们想查看所有与"恐怖主义"相关的文章。我会访问此链接查看所有文章:https://www.nytimes.com/topic/subject/terrorism

从这里,我可以点击各个链接,它将我引导到一个我可以抓取的URL。我在BeautifulSoup包中使用Python来帮助我检索文章文本。

这是我到目前为止的代码,它让我可以从一篇特定的文章中抓取所有的文本:

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="礼貌",并且这与其他新闻类别一致。

在每个列表类别下,都有一个链接将链接到文章。因此,您只需获取它并提取href即可。你的代码可能看起来像这样:

ol = soup.find('ol', {'class':'polite'})
lists = ol.findAll('li')
for list in lists:
link = list.find('a')
url = link['href']

若要单击"显示更多"按钮,您需要使用美丽汤之外的其他工具。您可以使用Selenium网络驱动程序点击它打开下一页。你可以按照这个SO问题的最高答案来学习如何做到这一点。

最新更新