Python 数据采集-爬取学校官网新闻标题与链接(基础)

Python 爬虫爬取学校官网新闻标题与链接

  • 一、前言
  • 二、扩展库简要介绍
    • 01 urllib 库
      • (1)urllib.request.urlopen()
    • 02 BeautifulSoup 库
      • (1)BeautifulSoup()
      • (2)find_all()
  • 三、完整代码展示
  • 四、小结

一、前言

⭐ 本文基于学校的课程内容进行总结,所爬取的数据均为学习使用,请勿用于其他用途

  • 准备工作:
    • 爬取地址:https://www.hist.edu.cn/index/sy/kyyw.htm
    • 爬取数据:新闻的标题与链接
    • 环境需求:安装扩展库 BeautifulSoup、urllib(⭐不会安装点这里 Python 下载安装第三方库)
  • 基本知识:
    • 了解网页的基本知识
    • 掌握 python 基础语法

二、扩展库简要介绍

接下来 Pola 将会简单介绍爬取数据过程中所用到的 urllib 库与 Beautiful 库的一些功能

01 urllib 库

urllib 库是 python 内置的 HTTP 请求库,包括以下模块:

  • urllib.request 请求模块
  • urllib.error 异常处理模块
  • urllib.parse url 解析模块
  • urllib.robotparser robots.txt 解析模块

(1)urllib.request.urlopen()

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‘
代码输出结果如下(篇幅过长,只截部分):
Python 数据采集-爬取学校官网新闻标题与链接(基础)_第1张图片

02 BeautifulSoup 库

BeautifulSoup 是 Python 的一个第三方库,可以用来解析 html 数据,我们使用它的主要功能就是从网页抓取数据:

  • BeautifulSoup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能
  • BeautifulSoup 通过解析文档为用户提供需要抓取的数据
  • Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码

(1)BeautifulSoup()

BeautifulSoup 将复杂的 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python对象。所有对象可以归纳为4种类型:

  • Tag:HTML 或者 XML 中的标签
  • NavigableString:标签中的文本内容(不包含标签)
  • BeautifulSoup:BeautifulSoup 对象表示一个文档的全部内容,支持遍历文档树和搜索文档树
  • Comment:HTML和XML中的注释

我们可以利用 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')

(2)find_all()

find_all() 为搜索文档树,搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。返回值类型是 bs4.element.ResultSet,即返回的是多个该对象的集合,可以用for循环遍历,完整的语法如下:
find_all( name, attrs, recursive, string, **kwargs)
参数意义如下:

  • name:查找所有名字为 name 的 tag。
  • attr:tag的属性(即标签的属性)
  • string:搜索文档中string字符串的内容
  • recursive: 调用 tag 的 find_all() 方法时,BeautifulSoup 会检索当前 tag 的所有子孙节点;如果只想搜索tag的直接子节点,可以使用参数 recursive=False

上面我们已转换 html 文档,接下来我们使用 find_all() 获取我们想要的数据,但在此之前,我们需要知道我们搜索数据的条件是什么?这需要我们通过调试网页得知,具体如下:(⭐ 不会调试网页的请查看 如何调试网页)

  • 通过调试网页我们知道,新闻标题所在元素全部包含在
  • 标签下,外层被
    标签所包裹, 该
    标签具有属性 class=“list-main-warp”,因此我们可以使用 find_all() 获取名字为 div 且属性为 class="list-main-warp"的 tag 数据,然后再使用 find_all() 从已获取的 div 数据里获取名字为 li 的 tag 数据,然后打印输出其中的 href(链接) 和 title(标题)
    Python 数据采集-爬取学校官网新闻标题与链接(基础)_第2张图片

代码实现如下:

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"))

输出结果如下:
Python 数据采集-爬取学校官网新闻标题与链接(基础)_第3张图片

三、完整代码展示

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 数据采集-爬取学校官网新闻标题与链接(进阶)继续学习吧!

你可能感兴趣的:(数据处理,python,爬虫,python爬虫)