⭐ 本文基于学校的课程内容进行总结,所爬取的数据均为学习使用,请勿用于其他用途
接下来 Pola 将会简单介绍爬取数据过程中所用到的 urllib 库与 Beautiful 库的一些功能
urllib 库是 python 内置的 HTTP 请求库,包括以下模块:
urlopen 返回的 response 对象是 http.client.HTTPResponse 类型,主要包含 read()、readinfo()、getheader(name)、getheaders()、fileno() 等方法,我们需要用到的是 read() 方法,如下:
# 导入 urllib.request 模块
import urllib.request
# 解析我们给定的 url: https://www.hist.edu.cn/index/sy/kyyw.htm
# 即读取给定 url 的 html 代码 --> 输入 url, 输出 html
response = urllib.request.urlopen('https://www.hist.edu.cn/index/sy/kyyw.htm')
# 打印我们获取到的数据,并以 utf-8 形式进行解码
# 需要注意:修改 pycharm 的编码方式为 utf8, 否则会报错
print(response.read().decode('utf-8'))
⭐ 不会修改 pycharm 的编码方式请参考:Pycharm-修改编码方式为 ‘utf8‘
代码输出结果如下(篇幅过长,只截部分):
BeautifulSoup 是 Python 的一个第三方库,可以用来解析 html 数据,我们使用它的主要功能就是从网页抓取数据:
BeautifulSoup 将复杂的 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python对象。所有对象可以归纳为4种类型:
我们可以利用 BeautifulSoup() 将上面读取到的 html 文档进行转换,如下:
import urllib.request
from bs4 import BeautifulSoup
# 读取给定 url 的 html 代码
response = urllib.request.urlopen('https://www.hist.edu.cn/index/sy/kyyw.htm')
content = response.read().decode('utf-8')
# 转换读取到的 html 文档
soup = BeautifulSoup(content, 'html.parser', from_encoding='utf-8')
find_all() 为搜索文档树,搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。返回值类型是 bs4.element.ResultSet,即返回的是多个该对象的集合,可以用for循环遍历,完整的语法如下:
find_all( name, attrs, recursive, string, **kwargs)
参数意义如下:
上面我们已转换 html 文档,接下来我们使用 find_all() 获取我们想要的数据,但在此之前,我们需要知道我们搜索数据的条件是什么?这需要我们通过调试网页得知,具体如下:(⭐ 不会调试网页的请查看 如何调试网页)
代码实现如下:
import urllib.request
from bs4 import BeautifulSoup
# 读取给定 url 的 html 代码
response = urllib.request.urlopen('https://www.hist.edu.cn/index/sy/kyyw.htm')
content = response.read().decode('utf-8')
# 转换读取到的 html 文档
soup = BeautifulSoup(content, 'html.parser', from_encoding='utf-8')
# 获取转换后的 html 文档里属性 class=list-main-warp 的 div 标签的内容
divs = soup.find_all('div', {'class': "list-main-warp"})
# 从已获取的 div 标签的内容里获取 li 标签的内容
lis = divs[0].find_all('li')
# 遍历获取到的 lis 列表,并从中抓取链接和标题
for li in lis:
print(li.find_all('a')[0].get("href"))
print(li.find_all('a')[0].get("title"))
import urllib.request
from bs4 import BeautifulSoup
# 读取给定 url 的 html 代码
response = urllib.request.urlopen('https://www.hist.edu.cn/index/sy/kyyw.htm')
content = response.read().decode('utf-8')
# 转换读取到的 html 文档
soup = BeautifulSoup(content, 'html.parser', from_encoding='utf-8')
# 获取转换后的 html 文档里属性 class=list-main-warp 的 div 标签的内容
divs = soup.find_all('div', {'class': "list-main-warp"})
# 从已获取的 div 标签的内容里获取 li 标签的内容
lis = divs[0].find_all('li')
# 遍历获取到的 lis 列表,并从中抓取链接和标题
for li in lis:
print(li.find_all('a')[0].get("href"))
print(li.find_all('a')[0].get("title"))
至此,我们利用 urllib 库和 BeautifulSoup 库以及我们掌握的网页基础知识爬取到了学校官网的新闻标题及链接,细心的你会发现,目前我们只能获取一页的新闻标题及链接数据,而且获取出来的新闻链接还是相对路径,不是可以即时使用的链接,需要转换后才能使用,但是学校的新闻不止一页,我们希望能够爬取所有页的新闻标题及链接,并且我们希望得到的新闻链接是绝对路径,另外能不能把爬取到的数据存储下来呢?怎么实现这些功能呢?
点击查看 Pola 的 Python 数据采集-爬取学校官网新闻标题与链接(进阶)继续学习吧!