引言
当我们提及 Python 爬虫时,可能忽略了爬虫技术的跨语言特性。实际上,除了 Python,还有众多可实现爬虫功能的编程语言,诸如 JavaScript、Ruby、Go 等。然而,Python 凭借简洁语法、强大库支持以及活跃社区,依然是网络爬虫领域的首选语言。
什么是网络爬虫
网络爬虫,又称网页蜘蛛,是一种自动化程序,旨在遵循特定规则,模拟浏览器行为,发送 HTTP 请求并接收响应,进而从万维网收集信息。
理论上,浏览器能执行的操作,爬虫皆可模拟。
爬虫技术与反爬虫技术
合理运用的爬虫技术能为数据分析、信息整合提供助力,但不当使用,如采用多线程暴力爬取,易引发网站服务器瘫痪,这亦是部分网络攻击的手段之一。
鉴于此,众多网站部署了反爬虫策略,包括但不限于:IP 访问频率限制、基于时间窗口的请求统计过滤、爬虫识别技术等。
但资深的爬虫开发者可通过优化代码、构建多 IP 池等手段绕过反爬虫机制,达成大规模数据采集目标。毕竟,爬虫依据预设规则访问网页,难免对网站网络带宽及服务器资源造成占用,甚至干扰网站正常运营。
Robots 协议
Robots 协议(亦称爬虫协议、机器人协议),即 “网络爬虫排除标准”,是网站与爬虫之间达成的一种国际互联网道德规范。网站可通过简单的 txt 格式文本文件告知爬虫其授权访问范围。
参考示例:https://www.example.com/robots.txt
1.以 Allow 开头的 URL 地址:明示允许特定爬虫引擎访问。
2.以 Disallow 开头的 URL 地址:表明禁止某爬虫引擎访问。
爬虫操作也应坚守道德底线,遵循业界规范。
网络爬虫步骤及相关技术
抓包
浏览器抓包:仅支持抓取浏览器产生的数据包。
抓包工具 Fiddler:专注于抓取 HTTP 请求与响应。
Cookie 与 Session 的联系与区别?
User - Agent:标识浏览器身份信息。
HTTP 与 HTTPS
HTTP 与 HTTPS 的差异
1.HTTP 是超文本传输协议,以明文形式传输数据,存在安全隐患。HTTPS 则通过在 TCP 和 2.HTTP 之间嵌入 SSL/TLS 安全协议,实现加密传输。
3.HTTP 连接建立流程简单,完成 TCP 三次握手即可传输报文。HTTPS 则需在 TCP 三次握手后,执行 SSL/TLS 握手,随后才可传输加密报文。
4.HTTP 默认使用 80 端口,HTTPS 则默认使用 443 端口。
5.HTTPS 需向 CA(证书颁发机构)申请数字证书,以验证服务器身份可信度。
HTTPS 如何化解 HTTP 的风险?
HTTP 明文传输易导致窃听、篡改与冒充风险。
HTTPS 借助 SSL/TLS 协议,通过信息加密、校验机制及数字证书,有效应对上述风险
HTTPS 具体怎样攻克三大风险?
采用混合加密保障信息机密性,抵御窃听;利用摘要算法确保数据完整性,防范篡改;借助数字证书存放服务器公钥,防范冒充。
快速入门
安装 requests
Pip 是 Python 的包管理工具,具备查找、下载、安装、卸载包的功能。Python 2.7.9 + 或 Python 3.4+ 版本已内置 pip。
查看版本与路径
pip --version
安装指定版本的 requests
pip install requests
:安装最新版本。
pip install requests == 2.11.0
:安装指定版本 2.11.0。
pip install requests >= 2.11.0
:安装最低版本为 2.11.0。
当与 Fiddler 抓包工具协同使用时,为避免卡顿,建议安装 requests 低版本。
同样,可在 PyCharm 通过点击 File -> Settings -> 项目:[项目名],选择 Python 解释器,点击 + 号,搜索并选择 requests 模块,指定版本号后点击安装。
案例演示
创建纯 Python 项目,新建 demo.py 并引入 requests 模块。
# 导入模块
import requests
# 通过 requests 模块模拟发送 get 请求,获取响应对象 response
resp = requests.get(url)
response 响应对象属性详解:
| 属性 | 说明 |
| encoding | 文本编码设置,例如:resp.encoding = "utf - 8" |
| status_code | 响应状态码,200 表示请求成功,4XX 意味客户端错误,5XX 则为服务端错误 |
| text | 响应体内容 |
| content | 以字节形式返回响应体,自动解码 gzip 和 deflate 编码数据 |
| url | 响应的 URL 地址 |
案例一:初体验,爬取百度首页并本地保存
结合 Fiddler 抓包工具测试以下代码。
resp = requests.get("http://www.baidu.com/")
设置自定义请求头 headers,参照知乎网的 Robots 协议,伪装 User-Agent。
resp = requests.get("http://www.zhihu.com/signin?next=%2F",
headers = {
"User - agent":"bingbot"
})
模拟浏览器 User-Agent。
resp = requests.get("http://www.baidu.com/",
headers = {
"User - agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
})
可采用 pathlib 或 open 两种方式保存文件。
案例二:传递 URL 参数
GET 与 POST 请求在传递 URL 参数时存在差异。
| 请求方式 | 参数传递方式 |
| GET | params = {"key1":"value1", "key2":"value2"},response = requests.get(url, params = params) |
| POST | data = {"key1":"value1", "key2":"value2"},response = requests.post(url, data = data) |
爬取必应搜索 “中国” 结果页并保存为 “中国.html”。
resp = requests.get("https://cn.bing.com/search",
headers = {
"User - agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
},
params = {
"q":"中国"
})
requests 库的局限性:无法抓取 AJAX 动态加载数据。
5万+

被折叠的 条评论
为什么被折叠?



