手把手教学:基于urllib和Beautifulsoup4获取新闻数据

原标题:手把手教学:基于urllib和Beautifulsoup4获取新闻数据

手把手教学:基于urllib和Beautifulsoup4获取新闻数据
文章图片
手把手教学:基于urllib和Beautifulsoup4获取新闻数据
01
安装第三方库Beautifulsoup4
本案例需使用urllib库获取网页 , 使用bs4库析取网页关键数据 。 由于urllib为标准库 , 因此无须另行安装 。 假定系统已经安装好pip , 则可通过以下方式安装Beautifulsoup4:
pipinstallbs4
若系统安装的是conda , 则可通过以下方式安装:
condainstallbs4
安装好之后 , 可以登录Python测试是否可以运行以下语句:
fromurllibimportrequest
frombs4importBeautifulSoup
若以上两句能正常运行 , 则说明本案例所需的两个库已经安装成功 。
02
案例应用
需求:提取上海对外经济贸易大学(http://www.suibe.edu.cn/)自2020年10月1日以来的快讯内容 。
分析:(1)首先 , 通过浏览器登录上海对外经贸大学官网 , 定位到快讯列表页面 。 可以发现 , 网页主体包含了近期发布20条新闻快讯 。 单击其中的一条快讯可链接到该标题对应的快讯页面 。 通过单击“下一页”按钮 , 可以到达下一页的新闻快讯 。 观察该网页关键HTML源代码:

手把手教学:基于urllib和Beautifulsoup4获取新闻数据
文章图片
得到新闻列表页面后 , 使用BeautifulSoup提取所有包含属性class为news_box的div标签 。 然后 , 对这个div标签内容 , 可逐个使用.find方法获取对应快讯的标题、超链接和发布时间 。 当然 , 在获取快讯发布时间的同时 , 我们可以同时判断它是否早于data_boudary 。 如果早于该时间 , 则停止获取快讯列表内容;否则 , 继续获取下一条快讯内容 。 当列表页面所有快讯信息获取完毕之后 , 如果最后一条快讯的发布时间仍晚于截止日期 , 则需通过“下一页”按钮链接 , 到达下一页的快讯列表继续获取快讯内容 。 对应的关键源代码为:

手把手教学:基于urllib和Beautifulsoup4获取新闻数据
文章图片
可以先获取属性class的值为wp_pagingclearfix的ul标签 , 然后利用.find方法获取属性class的值为next的a标签 , 从而获取属性href的值 , 以链接到下一个快讯列表 。 重复以上过程 , 直到最后一条快讯日期晚于截止日期 。
(2)在获取快讯列表之后 , 根据对应的链接 , 可进入对应的页面 , 获取快讯的阅读次数、发布源和新闻文本内容 。 新闻正文关键HTML源码如下:

手把手教学:基于urllib和Beautifulsoup4获取新闻数据
文章图片
在利用Beautifulsoup获取对应tag之后 , 可以用.find方法获取快讯的来源、浏览次数和新闻内容 。
03
实现代码
#coding=utf_8
frombs4importBeautifulSoup
fromurllibimportrequest
importtime
importssl
ssl._create_default_https_context=ssl._create_unverified_context
#获取快讯列表
defget_news_list(root,url,date_boundary):
article_list=[]
whileTrue:
#下载新闻列表页面
path=root+url
f=request.urlopen(path)
soup=BeautifulSoup(f,"html.parser")#使用html.parser解析器
#提取列表中新闻的发表日期、标题和链接
手把手教学:基于urllib和Beautifulsoup4获取新闻数据】foriteminsoup.find_all("div",{"class":"news_box