002 Python网络爬虫与信息提取 Requests库
[A] Requests库的安装
Pycharm中自行安装第三方库
[B] Requests库的七个主要方法
方法 | 说明 |
requests.request() | 构造一个请求,支持一下个方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应于HTTP的get方法 |
requests.head() | 获取HTML网页的头信息方法,对应于HTTP的head方法 |
requests.post() | 向HTML网页提价交post请求,对应于HTTP的post方法 |
requests.put() | 向HTML网页提价交put请求,对应于HTTP的put方法 |
requests.patch() | 向HTML网页提价交局部修改请求,对应于HTTP的patch方法 |
requests.delete() | 向HTML网页提价交删除请求,对应于HTTP的delete方法 |
实际上,request方法为Request库的基本方法,其他六种方法内部都是通过调用request方法来发送请求的。
[C] requests的get()方法
语法:
r = requests.get(url, params = None, **kwargs)
参数:
url:必填,拟获取页面的url链接
params:可选,url中的额外参数,字典获字节流格式
**kwargs:可选,12个控制访问的参数
返回值:一个包含服务器资源的 Response 对象
说明:
1. requests.get() 方法创建了一个向服务器发送请求的Request对象
2. 返回值 r 为一个包含服务器资源的 Response 对象,里面也包含请求的相关信息
示例代码:
import requests r = requests.get('http://www.baidu.com') # 打印状态码 # status = r.status_code # status = r.text # status = r.encoding # status = r.apparent_encoding status = r.content print(status) # 更改编码 # r.encoding = 'utf-8' # t = r.text # print(t)
Response对象的属性
属性 | 说明 |
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示连接失败 |
r.text | HTTP响应内容的字符串形式,即url对应的页面内容 |
r.encoding | 从HTTP header 中猜测的响应内容的编码形式 |
r.apparent_encoding | 从内容中分析出来的响应内容的编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
r.headers | 获取HTTP的头部信息 |
r.encoding 和 r.apparent_encoding 的比较:
网络上的资源都是经过编码之后存储在服务器中的,有的服务器对编码形式有格式要求,有的没有;
有格式要求的,会在其 header 信息的 charset 属性中赋值,没有格式要求的则 charset 属性未被赋值
1. r.encoding 是从HTTP的header中直接读取对应的 charset 的值,获取编码格式要求,如果 charset 中没有值,则编码默认为ISO-8859-1
2. r.apparent_encoding 是根据返回资源的内容中分析,确定该资源的编码形式
实际上,r.apparent_encoding 中存储的编码格式要相比于r.encoding 更准确
[D] 爬取网页的通用代码框架
通用代码框架:即一组代码,可以准确可靠的爬取网页上的内容。
1. 爬虫代码在运行时,经常会出现各种错误,这些错误会导致爬取内容失败,常见的Requests库的异常有六种:
异常 | 说明 |
requests.ConnectionError | 网络连接错误异常,如DNS查询失败,拒绝访问等等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooMangRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
2. 通用代码框架代码示例
谨记:网络连接有风险,异常处理很重要
Requests库提供了一种异常响应的方法:r.raise_for_status() 能判断响应码r.status是不是200,不是则产生异常HTTPError
import requests def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() # 如果状态不是200,则抛出HTTPError异常 r.encoding = r.apparent_encoding return r.text except: return '哎呦,产生异常了,我的主人' if __name__ == "__main__": url = 'http://ww.baidu.com' print(getHTMLText(url))
[E] HTTP协议及Requests库方法
1. 相关概念解释
HTTP协议:Hypertext Transfer Protocol,超文本传输协议。
HTTP是一个基于 响应与请求 模式的,无状态的应用层协议。
请求与响应模式:即用户发起请求,服务器响应的模式
无状态:即第一次请求跟第二次请求之间并没有相应关联
应用层协议:表示该协议工作在TCP协议之上
HTTP协议采用URL作为定位网络资源的标识。
URL格式:http://host [:post] [path]
host:合法的 Internet 主机域名或者IP地址
post:端口号,缺省时默认为80
path:请求资源的路径
HTTP URL的理解:
URL是通过HTTP协议存取资源的 Internet 路径,一个URL就对应一个数据资源
2. HTTP协议对资源的操作
HTTP协议对资源有一些操作的功能,如下:
方法 | 说明 |
get() | 请求获取URL位置的资源 |
head() | 请求获取URL位置资源的响应信息报告,即获得该资源的头部信息 |
post() | 请求向URL位置的资源附加新的数据,不修改原来的数据 |
put() | 请求向URL位置存储一个资源,覆盖掉原来位置的资源 |
patch() | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
delete() | 请求删除URL位置存储的资源 |
put 方法和 patch 方法的比较:
1. put 方法是用提交的数据替换原来该位置的数据,之前的数据都不存在了
2. patch 方法是根据提交的数据更新原来该位置的数据
比较来说,put 是用新的数据覆盖掉原来的数据,而 patch 是用新的数据来修改原来的数据
HTTP协议对资源的操作的理解:
1. HTTP协议通过URL对网络上的资源进行标识;
2. 用户可以通过HTTP协议的get,head方法获取数据;
3. 也可以通过put, post, patch, delete方法将自己的数据放到网络上,或者对网络上的资源进行修改和删除等操作;
4. 在 HTTP 的世界里,网络通过和服务器都是黑匣子,我们能直接看到的就是URL和这些操作方法。
HTTP协议与Requests库的对应关系:
HTTP协议 | Requests库方法 | 功能一致性 |
GET | requests.get() | 一致 |
HEAD | requests.head() | 一致 |
POST | requests.post() | 一致 |
PUT | requests.put() | 一致 |
PATCH | requests.patch() | 一致 |
DELETE | requests.delete() | 一致 |
[F] Requests库的主要方法解析
Requests库的主要方法指的就是 Requests.request() 方法.
requests.request(method, url, **kwargs)
参数:
method:请求方式,即'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'这些方法
url: 拟访问的链接
**kwargs: 控制访问的参数,均为可选项
params:字典或字符串,作为参数增加到 url 中
给 params 赋值键值对,这些信息会被添加到当前 url 中去,服务器会根据 url 和 params中的要求,对资源进行筛选并返回回来,如:
import requests kv = {'key1': 'value1', 'key2': 'value2'} r = requests.request('GET', 'http://python123.io/wa', params=kv) print(r.url) # 返回值为:https://python123.io/wa?key1=value1&key2=value2
data: 字典,字符串或文件对象,作为Requests的内容
通过 data 传入的数据不会添加到 URL 中,会存储在 url 对应位置的资源中
import requests # 存储键值对 kv = {'key1': 'value1', 'key2': 'value2'} r = requests.request('POST', 'http://python123.io/ws', data=kv) # 存储字符串 body = '主体内容'.encode(encoding='UTF-8') # 将字符串进行编码后存储 r = requests.request('POST', 'http://python123.io/ws', data=body)
json:JSON格式的数据,作为 request 的内容,类似于data,目前没发现什么区别
kv = {'key1': 'value1', 'key2': 'value2'} r = requests.request('POST', 'http://python123.io/ws', json=kv)
headers: 字典,HTTP定制头,即定制某个url访问魔偶个HTTP的协议头
# headers hd = {'user-agent': 'Chrome/10'} # 模拟Chrome v10版本发送请求 r = requests.request('POST', 'http://python123.io/ws', headers=hd)
cookies: 字典或者CookieJar, Request中的cookie,可以从HTTP协议中解析cookie,属于高级功能
ayth:元组,支持HTTP认证功能,属于高级功能
files:字典类型,用于向 url 提交一个文件
# files fs = {'file': open('data.xls', 'rb')} r = requests.request('POST', 'http://python123.io/ws', files=fs)
timeout:设定超时时间,以秒为单位,当在指定时间未响应时会报错
proxies:字典类型,设定访问代理服务器,可以增加登录认证
设置代理服务器后,我们访问服务器时使用的IP地址就是代理服务器的IP地址,这样有效的隐藏真实的IP地址,防止爬虫被逆追踪。
# proxies pxs = {'http': 'http://user:pass@10.10.10.1:1234', 'https': 'https://10.10.10.1:1234'} r = requests.request('GET', 'http://www.baidu.com', proxies=pxs)
allow_redirects: True/False, 默认为True,重定向开关
stream:True/False, 默认为True,获取内容立即下载开关
verify:True/False, 默认为True,认证SSL证书开关
cert:本地SSL证书路径
[G] Requests相关方法解析
1. requests.get(url, params=None, **kwargs)
2. requests.head(url, **kwargs)
3. requests.post(url, data=None, json=None, **kwargs)
4. requests.put(url, data=None, **kwargs)
5. requests.patch(url, data=None, **kwargs)
6. requests.delets(url, **kwargs)
get()方法是最常用的一个方法,因为服务器上的数据可以随便访问,但是对于数据提交,修改和删除等操作是严格把控的