基于 Python 网络爬虫设计与实现
古志敏,吴明珠
(广州现代信息职业技术学院, 广州 510000 )
摘
要: 随着科学技术的发展,网络资源对人们的生活产生巨大的影响,为了进一步简化查找和精准定
位网络资源,网路爬虫技术日渐兴起。Python 的兼容性强、社区庞大,因此基于 Python 的网络爬虫技
术逐渐成为主流。分析年轻人的娱乐喜好,采用了基于 Python 的网络爬虫技术,设计了热门视频信息
爬虫程序,实现对视频信息的保存,为后续查看与使用视频信息提供便利。
关键词: Python 语言;网络爬虫;数据解析
DOI:10.16184/j.cnki.comprg.2023.09.016
1
概述
网络爬虫。 相比于传统的聚焦爬虫, 它能够实时监测
Python 作为一种新的流行编程语言, 近年来在网络
目标网站的变化并对新增、 更新或删除的内容进行有
爬虫领域得到广泛的应用, 其强大的功能模块和平台兼
效的采集和处理, 因此适用于许多场合。 增量式爬虫的
容性是它备受推崇的原因。 新时代的年轻人大多数还无
原理如下。
需承担沉重的生活压力, 因此, 其付费能力和付费意
愿都比较高。 随着年轻人收入与消费能力地不 断增强,
中国娱乐市场的发展前景光明。 因此, 通过爬取某网
站的热门视频数据, 可以了解年轻人的喜好及定位他
们的需求。
2
相关技术
2.1
Python 语言
Python 是一种高级层次的编译型、 解释型、 互动性
( 1) 首 先 访 问 目 标 网 站 , 并 获 取 需 要 爬 取 的 页 面
列表。
( 2 ) 将 页 面 的 URL 加 入 待 爬 取 队 列 中 , 并 按 照 一
定规则进行排序。
(3 ) 从待爬取队列中取出一个 URL , 并发送 HTTP
请求到目标服务器。
(4 ) 在目标服务器返回响应后, 解析 HTML 、 CSS 、
JavaScript 等资源, 并提取其中的链接和数据。
和面向对象的脚本语言, 它提供了高效的高级数据结
(5 ) 在解析过程中, 记录已访问的 URL 、 提取的数
构, 能简单有效地面向对象编程。 Python 的上述特点使
据和 新发现的 URL 等 信 息 , 并 存 储 到 一 个 数 据 表 或 者
它可以在大多数平台用于编写脚本及快速开发应用, 其
数据库中。
应用场景广泛, 包括网络 编程、 软件测试、 网络爬虫、
人 工 智 能 和 数 据 分 析 等 。 灵 活 性 和 易 用 性 使 得 Python
成为当今最流行的编程语言之一。
2.2
(6 ) 根据一定的规则来判断哪些数据是新的、 已经
存在的或者需要更新的, 并将它们分类保存。
( 7 ) 针 对 每 个 新 的 、 更 新 的 或 删 除 的 URL 进 行 相
网络爬虫概念和原理
应的处理, 例如, 采集新数据、 更新旧数据或删除无效
爬虫是指通编写程序模拟浏览器在互联网上 浏览,
数据。
自动按照要求抓取数据的过程。 它可以根据设置的规则
和算法, 在网络上自动采集信息。 爬虫按照其不同的结
( 8) 将 新 获 取 的 数 据 保 存 到 本 地 文 件 或 者 数 据 库
中, 等待后续处理和分析。
构和原理, 被分为 4 种类型。 这些类型包括: 通用爬
在整个过程中, 增量式爬虫会定期访问目标 网站,
虫、 聚焦爬虫、 深度爬虫和增量式爬虫。 这些爬虫各有
并根据变化情况进行相应的更新和采集。 通过这种方
不同的特点和适用场景。 例如, 通用爬虫可以遍历整个
式, 增量式爬虫可以实现对目标网站的动态监测和数据
互联网并抓取数据, 而聚焦爬虫仅针对特定主题的网页
采集, 提高了采集效率, 并 降低了重复采集的工作量。
进行抓取。 无论是哪种类型的爬虫, 都可以帮助用户在
增量式爬虫工作流程如下:
互联网上获取大量有价值的数据, 并帮助更好地理解和
址, 并通过 urllib 库或者 requests 库向目标站点发起请求
分析互联网的内容。 在此采集某网站热门视频数据信
以 获 取 HTML 内 容 。
息, 主要应用增量式爬虫。
或者 Xpath 获取想要的目标数据并将目标数据存储至数
(1) 要确定初始的 URL 地
( 2) 通 过 Python 解 析 库 re 、 BS4
下面针对增量式爬虫的概念与原理进行详细的介绍。
据库, 常见的数据库有 MySQL 、 Redis 和 MongoDB , 根
增量式爬虫是一种能够动态发现和抓取新数 据的
据不同的数据类型采用不同的数据库。
( 3 ) 实时监测
2023.9
电脑编程技巧与维护
163
是否有 URL 更 新 , 若 无 更 新 , 则 整 个 增 量 式 爬 虫 的 工
向下滚动滑轮时网页没有刷新, 但是网页内容在不断地
作流程结束。 增量式爬虫的工作流程如图 1 所示。
更新, 基于上述特点可以推断出目标站点是无刷新更新
页面 , 其 使 用 Ajax 交 互 技 术 的 概 率 比 较 大 , 因 此 需 要
确 定 初 始 的 URL
打开开发者工具, 寻找存储数据的链接。
通过谷歌浏览器或者火狐浏览器寻找爬虫入口, 具
体 如 下 : 右 键 → 检 查 → 开 发 者 工 具 →network→XHR 发
获 取 HTML 内 容
现可以抓取到隐藏目标数据的链接, 其中, ps 为一页的
视 频 量 ; pn 为 页 码 。 经 过 测 试 发 现 , 该 网 站 的 热 门 视
解 析 HTML 内 容
频一共有 26 页, 每页有 20 条视频, 因此热门视频一共
有 520 条。 在抓取数据时, 只需要更改 pn 的 值 便 可 以
直到无新
的 URL 即
停止爬虫
存储数据
获取所有目标数据的连接, 目标数据如图 3 所示。
后 期 更 新 的 URL
检 查 URL 的 更 新
情况
图1
3
增量式爬虫的工作流程
爬虫设计思路
设计主要针对年轻人群的娱乐需求, 充分利用网络
爬虫技术对所需要的网页数据进行获取, 以便后期进行
图3
分析。 爬虫程序的设计思路包括: 确定目标网站、 获取
网络资源、 解析视频数据、 保存数据信息。 爬虫工作流
4.2
目标数据
目标 URL 请求
类似 于 在 浏 览 器 中 输 入 URL 地 址 , 网 络 爬 虫 需 要
程如图 2 所示。
通过发送请求到服务器来获取想要的信息。 当服务器接
确定目标网站
收到请求后, 会返回对应的响应信息。 如果使用 Python
编写爬虫程序, 可以使用第三方库 requests 。 requests 库
获取网络资源
是 一 个 Python 的 HTTP 请 求 库 , 可 以 用 于 向 目 标 URL
发起请求并获取相应的内容和数据。 可以通过执行
解析视频数据
“pip install requests ” 命令来安装 requests 库。 一旦安装
完 成 , 就 可 以 调 用 requests 库 中 的 get() 方 法 , 并 传 入
保存数据信息
目标 URL 地址和 User-Agent 参数来向 目 标 网 站 发 起 请
求, 其中, User-Agent 是指让网络协议的对端来识别发
图2
爬虫工作流程
起请求的用户代理软件的应用类型、 操作系统、 软件开
首先, 确定爬取的目标网站地址, 其次, 确定视频
发商及版本号的一串字符。 通过 get() 方法向目标服务器
数据信息包括视频名称、 播放量、 点赞数、 收藏数、 分
发起请求, 并获取响应对象 Response [200] , 即 response
享数、 投币数、 视频上传者昵称、 视频描述信息、 视频
= requests.get ( ‘目 标 url’, headers= {User-Agent 参 数 }) ,
分类、 视频链接, 最后, 保存视频数据为 csv 格式文件。
获 取 Response 对 象 后 调 用 json() 方 法 即 可 获 取 完 整 的
4
功能模块实现
json 格 式 的 数 据 , 即 response.json() 。 JSON ( JS 对 象 标
4.1
寻找爬虫入口
记) 是一种轻量级的数据交换格式, 目前使用特别广
哔哩哔哩网站与其他网站不同, 无法直接在网页源
泛。 Json 是用完全独立于编程语言的文本格式来存储和
码中找到需要抓取的具体信息, 经过测试发现, 在鼠标
表示数据, 它简洁和清晰的层次结构使得 JSON 成为理
164
2023.9
电脑编程技巧与维护
想型的交互语言, 可以在不刷新网页的情况下自动更新
wirte() 函数将解析的数据写入 csv 文件中, 并保存。 需
数据, 它在 Ajax 数据交互中的应用极为常见。
要注意的是, 每次写入数据时需要用逗号分隔, 并使用
4.3
解析视频数据
回车符分隔行。
由于需要获取的目标数据来自 XHR 文件 , 且 在 图
5
数据可视化
3 中可以看到目标数据在 json 格式的字符串中, 所以采
数据可视化是一种通过图表和图形等方式对原始数
用 jsonpath 第三方库解析 json 数据, jaonpath 是用来解析
据进行分析和展示的方法。 在此将使用数据分析和可视
json 数据用的, 它提供的 json 解析能力非常强大。 可以
化技术来呈现爬取的数据。
通 过 pip3 install jsonpath 安 装 jsonpath, 通 过 使 用 json-
首先, 需要读取、 处理爬取的数据, 并将其转换为
path 可以有效地查找对应节点, 获取想要的数据。 json-
可以被常见的数据可视化工具所识别的格式, 通常涉及
path 中的 $ 符表示根节点, .. 表示相对节点。 无论节点在
对数据进行过滤、 排序、 聚合、 计算等操作。 然后, 可
何处, 匹配所有符合条件的节点的源代码都如下所示。
以使用 Python 的各种数据可视化库 , 例如, Matplotlib 、
# 视频标题
title = jsonpath.jsonpath(data, ‘$..title ’)
# 视频播放量
view = jsonpath.jsonpath(data, ‘$..view ’)
Seaborn 等, 来创建各 种 图 表 和 图 形 。 可 以 根 据 数 据 的
对于其他的数据信息, 可以采用同样的方法进行
以便更好地理解和分析数据。 这些结论和洞察可以帮助
不同特点和需求来选择和设计图表和图形, 例如, 条形
图、 折线图、 饼图、 热力图、 散点图等。 最后, 在完成
数据可视化之后, 可以得到一 个直观、 易理解的结果,
获取。
用户更好地了解所研究的主题或问题, 并指导用户进一
4.4
多页面爬取
步研究和实践。
通过上述操作, 可以很好地实现目标网页的信息抓
5.1
读取数据
取, 但是需要大量的抓取数据, 因此要对视频数据进行
在读取数据阶段, 需要导入第三方库 pandas , pan-
多页面抓取。 通过对每个 XHR 中的 URL 进行观察, 发
das 是基于 Numpy 的一种工具, 可以用于数据分析。 调
现页面变化后目标 URL 中只有参数 pn 会发生改变, 并
用 pandas 库中的 read_csv() 方 法 读 取 存 储 视 频 数 据 的
且 pn 与 页 码 的 关 系 为 pn= 页 码 。 根 据 发 现 的 规 律 , 可
“**** 视频数据 .csv ”文件。
以使用循环构造出不同页面的 URL , 源代码如下。
5.2
Echart 介绍
for pn in range(1, 27):
url =f'https://api.bilibili.com/x/web -interface/
popular?ps=20&pn={pn}'
标库, 可以流畅地运行在 PC 端和移动设备上, 其兼容
构造出 26 页 URL 地址后 , 通 过 requests 库 对 每 个
图表。 Pyechart 可以通过 Python 调用 Echarts , 实现数据
商业级数据表 (Echarts ), 是一个纯 JavaScript 的图
大部分浏览器, 提供直观、 生动、 可交互的数据可视化
URL 发 起 请 求 , 并 获 取 目 标 的 json 数 据 。 在 此 过 程 中
可视化的效果。
为保证数据的 完整性及目标站点的反爬措施, 需要添加
5.3
数据处理阶段
等 待 动 作 。 通 过 导 入 Python 内 置 的 time 模 块 , 并 调 用
在处理数据时, 首要任务是检查视频数据是否存在
time 模块中的 sleep() 方法, 设置休眠。 为了让休眠等待
缺失值。 通过调用 isnull() .sum 方 法 , 可 以 监 测 每 列 数
的时间更加与人为相似, 可以设置休眠等待的时间为随机
据中缺失值的总数。 经过方法调用后发现并未出现缺失
数。 通过导入 Python 内置的 random 模块, 并调用 random
值, 因此不再做处理。
模块中的 randint() 方法, 实现随机休眠时间为 3~5 s 的任
5.4
意时间, 代码如下。
time.sleep(random.randint(3, 5))。
4.5
数据存储
可视化分析阶段
在可视化分析阶段, 需要导入 Pyechart 库进行不同
视频分类统计柱状图的绘制。
在绘制柱状图时, 首先要确定 x 轴与 y 轴。 x 轴为
在完成数据解析之后, 通常需要将抓取的数据以一
视频分类, y 轴为统计数量, 并将 x 、 y 轴的数据存放在
种 结 构 化 数 据 的 形 式 进 行 保 存 , 可 以 使 用 Python 的 文
列 表中, 即 title_x = [] , count_y = [] 。 通过 Bar 对象 设
件处理语句来将解析完的数据以 csv 的格式存储。
置 x 轴、 y 轴以及参数信息, 其中, 通过 title_opts 设置
首先, 通过 Python 内置的 csv 库来创建一个 csv 文
图表标题, 通过 xaxis_opts 中的 name 设置 x 轴名称为分
件 并 打 开 它 , 命 名 为 “ Bilibili.csv ” 。 然 后 , 可 以 使 用
类, 通过 axislabel_opts= { “rotate ” :60} 设置 x 轴的标签
2023.9
电脑编程技巧与维护
165
旋转 60° 。 标签如果不旋转, 则会导致图表内容不清晰,
造成误判。 最后, 通过 render() 方法生成排名前 10 的视
6
结语
通过对热门视频数据的抓取, 挖掘出当代年轻人在
频分类柱状图, 视频分类统计图如图 4 所示。
娱乐方面的需求与定位。 从抓取的数据来看, 搞笑娱乐
60
及游戏方面的视频比较受年轻人的喜爱, 可能现在的年
轻人工作中的压力比较大, 需要通过观看此类视频来
50
缓解压力。 此数据还可以作为视频创作者创作视频时
40
30
的参考。
参考文献
58
52
20
[1] 侯洁茹 , 吕继续 . 基于 Python 的天猫商品爬虫技术
38
[J] . 信息技术 , 2019 (32) : 10.
29
10
20
20
16
16
13
剪
视
影
人
文
历
辑
史
谈
杂
影
食
美
视
制
竞
电
子
书
[J] . 现代信息科技, 2023 (6) : 85-87.
[3] 李红. 基于 Python 爬虫的太原天气数据分析与可视
短
片
-手
作
技
音
分类
-配
常
日
游
机
单
戏
戏
游
机
手
笑
搞
[2] 冯晓磊. 基于 Python 的拉勾网网络爬虫设计与实现
11
0
化 研 究 [ J] . 信 息 与 电 脑 ( 理 论 版 ), 2023 ( 4) :
图4
视频分类统计图
212-214.
[4] 孙握瑜. 基于 Python 的新浪微博爬虫程序设计与实
核心代码如下。
bar = (Bar()
.add_xaxis(title_x)
.add_yaxis('',count_y)
.set_global_opts(title_opts=opts.TitleOpts(title="B
站数据分析 "), xaxis_opts=
opts.AxisOpts(name_rotate=0,name=" 分类 ",axislabel_opts={"rotate":60})))
bar.render(' 分类前十.html')
现 [J] . 科技资讯 , 2022 (12) : 34-37.
[5] 裴丽丽. 基于 Python 对豆瓣电影数据爬虫的设计与实
现 [J] . 电子技术与软件工程, 2019 (13) : 176-177.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(上接第 152 页)
[5] 王征, 何云丰, 曹小涛, 等 . 基于 FPGA 的大面阵
[2] 赵 志 刚 , 郭 金 川 , 杜 杨 , 等 . 基 于 DDR2 SDRAM
缓存的 CMOS 图像数据采集与传输系统 [J] . 仪表
技术与传感器, 2010 (6) : 90-93.
[3] 张贵祥, 金光, 郑亮亮, 等. 高速多通道 CCD 图像
数 据 处 理 与 传 输 系 统 设 计 [ J] . 液 晶 与 显 示 ,
2011 , 26 (3) : 397-403.
[4] 孙春凤, 袁峰, 丁振良 . 基于 FPGA 的多通道高速
CMOS 图 像 采 集 系 统 [ J] . 计 算 机 工 程 与 应 用 ,
CMOS 相机高 速率电子学系统设计 [J] . 液 晶 与 显
示, 2016 (2) : 173-178.
[6] 张克寒, 李明伟 . 高清 CMOS 图像传感器多通道数
据 传 输 系 统 设 计 [J] . 仪 表 技 术 与 传 感 器 , 2017
(2) : 54-57.
[7] 金明磊 . 基于 FPGA 的激光成像质心提取算法的硬
件实现 [J] . 空间控制技术与应用 , 2017, 43 (4) :
63-67.
2008 , 44 (21) : 46-48.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(上接第 143 页)
[2] 赵银燕 , 杨凯 . 柿竹园多金属矿三维可视化综合管
统性能良好。
控系统设计与实现 [J] . 采矿技术 , 2022, 22 (6) :
参考文献
[1] 李文锋 , 赖颖琦 , 王成 , 等 . 智慧公交安全综合管
控平台设计与实现 [J] . 福建电脑 , 2023, 39 (1) :
74-79.
166
2023.9
电脑编程技巧与维护
4-9.
[3] 张兵 . 煤矿智能化综合管控平台研究 [J] . 工矿自
动化 , 2022, 48 (S2) : 65-69.
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )