如何通过网络抓取《纽约时报》中某个类别的所有文章

时间:2019-11-05 13:56:41

标签: 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运行上面的代码。我将如何做到这一点,尤其是考虑到页面的格式?如果查看更多文章的唯一方法是手动选择列表底部的“ SHOW MORE”按钮,该怎么办?这些功能包含在BeautifulSoup中吗?

1 个答案:

答案 0 :(得分:0)

您可能希望限制一次要拉几条文章。我点击了“显示更多”按钮几次,直到出现了恐怖主义类别,而且这种情况一直持续下去。

要找到链接,您需要分析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']

要单击“显示更多”按钮,您需要使用除精美汤之外的其他工具。您可以使用Selenium Webdriver单击它以打开下一页。您可以按照this SO question的最高答案进行学习。