1.网路爬虫
1.1引言
我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP、JAVA、C#、C++、Python。
**为什么Python的爬虫技术会异军突起呢?**
Python火并不是因为爬虫技术,而是AI人工智能、数据分析(**GoogleAlphaGo**)等等功能;这些Java其实也能做,而选择Python做爬虫是因为Python相对来说比较简单,而且功能比较齐全。
1.2.什么是网络爬虫
网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。通俗来讲,网络爬虫就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
> **原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。**
1.4.应用场景
- **数据展示**:将爬取的数据展示到网页或者APP上,比如:百度新闻、今日头条
- **数据分析**:从数据中寻找一些规律,比如:慢慢买(价格对比)、TIOBE排行等
- **自动化测试**:比如想要测试一个前端页面的兼容性、前端页面UI是否有bug,只需要模拟执行表单提交、键盘输入等页面操作
1.5.网络爬虫是否合法
爬虫作为一种计算机技术就决定了它的中立性,因此爬虫本身在法律上并不被禁止,但是利用爬虫技术获取数据这一行为是具有违法甚至是犯罪的风险的。所谓具体问题具体分析,正如水果刀本身在法律上并不被禁止使用,但是用来捅人,就不被法律所容忍了。
1.5.1.爬虫技术与反爬虫技术
爬虫目前能造成的技术上影响在于野蛮爬取,即`多线程爬取`,从而导致`网站瘫痪`或不能访问,这也是大多数网络攻击所使用的方法之一。
由于爬虫会批量访问网站,因此许多网站会采取反爬措施。例如:1.IP频率、流量限制;2.请求时间窗口过滤统计;3.识别爬虫等。
但这些手段都无法阻止爬虫开发人员优化代码、使用多IP池等方式规避反爬措施,实现大批量的数据抓取。由于网络爬虫会根据特定的条件访问页面,因而爬虫的使用将占用被访问网站的网络带宽并增加网络服务器的处理开销,甚至无法正常提供服务
2.抓包
- 浏览器抓包(**仅能抓取浏览器的数据包**)
- 抓包工具fiddler(**基本用于抓取HTTP**)
3.HTTP与HTTPS
1.1HTTP 与 HTTPS 有哪些区别?
(1)HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
(2)HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
(3) HTTP 的端口号是 80,HTTPS 的端口号是 443。
(4)HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的
1.2HTTPS 解决了 HTTP 的哪些问题?
HTTP 由于是明文传输,所以安全上存在以下三个风险:
**窃听风险**,比如通信链路上可以获取通信内容,用户号容易没。
**篡改风险**,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
**冒充风险**,比如冒充淘宝网站,用户钱容易没
1.3HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议,可以很好的解决了上述的风险:
**信息加密**:交互信息无法被窃取,但你的号会因为「自身忘记」账号而没。
**校验机制**:无法篡改通信内容,篡改了就不能正常显示,但百度「竞价排名」依然可以搜索垃圾
广告。
**身份证书**:证明淘宝是真的淘宝网,但你的钱还是会因为「剁手」而没。
1.4HTTPS 是如何解决上面的三个风险的?
**混合加密**的方式实现信息的**机密性**,解决了窃听的风险。
**摘要算法**的方式来实现**完整性**,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完
整性,解决了篡改的风险。
将服务器公钥放入到**数字证书**中,解决了冒充的风险。
4.快速入门
4.1.安装requests
pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装和卸载的功能,现在大家用到的所有包不是自带的就是通过pip安装的。Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。
- **显示版本和路径**
pip --version
- **安装指定版本的requests**
pip install requests # 最新版本
pip install requests==2.11.0 # 指定版本
pip install requests>=2.11.0 # 最小版本
> **由于所有请求都需要经过fiddler这个抓包软件进出。所以如果requests与fiddler一起使用,请不要使用requests最新版本,不然直接会卡死,降版本使用即可。**
也可以直接通过PyCharm来安装requests模块,点击`File -> Settings -> 项目: python10`,选择Python解释器,点击 `+` 号,输入选择requests模块并指定安装版本号(例如:2.11.0),最后点击 `安装包(I)` 按钮即可。
4.2.案例演示
创建纯python项目,新建demo.py并导入requests模块
# 导入模块
import requests
# 通过requests模块模拟发送get请求,并得到响应对象response
resp = requests.get(url)
response响应对象属性介绍:
| 属性 | 说明 |
| ----------- | ------------------------------------------------------------ |
| encoding | 文本编码。例如:resp.encoding="utf-8" |
| status_code | 响应状态码。<br />200 -- 请求成功<br />4XX -- 客户端错误<br />5XX -- 服务端响应错误 |
| text | 响应体。 |
| content | 字节方式响应体,会自动解码gzip和deflate编码的响应数据 |
| url | 响应的URL地址。
- **案例一:快速入门,爬取百度官网并保存到本地**
**请结合fiddler抓包工具进行以下代码测试。**
```python
resp = requests.get("http://www.baidu.com/")
```
定制请求头headers,请结合[知乎网](https://www.zhihu.com/robots.txt)的Robots协议进行设置。**伪装User-Agent**
```python
resp = requests.get("http://www.zhihu.com/signin?next=%2F",
headers={
"User-agent": "bingbot"
})
```
定制请求头headers,模拟使用浏览器的User-Agent值。
```python
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参数**
POST和GET请求方式在传递URL参数时,稍有不同。
| GET方式 | POST方式 |
| ---------------------------------------- | -------------------------------------- |
| params={"key1":"value1","key2":"value2"} | data={"key1":"value1","key2":"value2"} |
| response=requests.get(url,params=params) | response=requests.post(url,data=data) |
爬取必应搜索“中国”之后的网页,保存为“中国.html”
```python
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动态加载的数据**