Python 爬虫 - 高阶指南

 

引言

当我们提及 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 参数时存在差异。 

请求方式参数传递方式
GETparams = {"key1":"value1", "key2":"value2"},response = requests.get(url, params = params)
POSTdata = {"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 动态加载数据。 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值