python爬虫之requests库入门笔记
原先写爬虫都是采用的urllib+Re(正则表达式)来实现的
今天又了解到Requests库,它用来发起请求比urllib要方便许多,现在就来学习一下
我是根据中国大学mooc上北京理工大学嵩天老师的《Python网络爬虫与信息提取》课程进行入门学习的
requests库的官网地址

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 |
这些http方法对应的相关说明如下
| 方法 | 说明 |
|---|---|
| GET | 请求获取URL位置的资源 |
| HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
| POST | 请求向URL位置的资源后附加新的数据 |
| PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
| PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
| DELETE | 请求删除URL位置存储的资源 |
get方法
requests.get(url,params=None,**kwargs)
分别是url地址,发送的参数,已经函数的其他参数
返回的是一个Response对象,下面是Response对象的一些属性
| 属性 | 说明 |
|---|---|
| r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
| r.text | HTTP响应内容的字符串形式,即,url对应的页面内容 |
| r.encoding | 从HTTP header中猜测的响应内容编码方式 |
| r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
| r.content | HTTP响应内容的二进制形式 |
import requests
r = requests.get("http://www.baidu.com")
type(r)
requests.models.Response
r.status_code
200
r.text
可以发现,r.text.属性得到的网页数据里面,中文没有正常的显示

从返回的数据了解到r.encoding是ISO-8859-1,因为r.encoding的值来源于header的charset属性
如果header中不存在charset,则认为编码为ISO‐8859‐1
查看r.headers
r.headers
r.text根据r.encoding显示网页内容,就会显示出乱码
然后查看r.apparent_encoding,它是根据文本中的内容去猜测应该是什么编码方式
r.encoding = 'utf-8'
r.text
显示正常了
head()方法
>>> r = requests.head('http://httpbin.org/get')
>>> r.headers
{'Content‐Length': '238', 'Access‐Control‐Allow‐Origin': '*', 'Access‐Control‐Allow‐Credentials': 'true', 'Content‐Type': 'application/json', 'Server': 'nginx', 'Connection': 'keep‐alive', 'Date': 'Sat, 18 Feb 2017 12:07:44 GMT'}
>>> r.text
''
post()方法
data参数就是psot方法提交的数据
向URL POST一个字典自动编码为form(表单)
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post('http://httpbin.org/post', data = payload)
>>> print(r.text)
{ ...
"form": {
"key2": "value2",
"key1": "value1"
},
}
向URL POST一个字符串自动编码为data
>>> r = requests.post('http://httpbin.org/post', d a t a = 'ABC')
>>> print(r.text)
{ ...
"data": "ABC"
"form": {},
}
其他的几个方法类似
requests.request()方法
requests.request(method, url, **kwargs)
- method : 请求方式,对应get/put/post等7种
- url : 拟获取页面的url链接
- **kwargs: 控制访问的参数,共13个
其实http相对应的这六个方式实际上调用的是requests方法
method : 请求方式
r = requests.request('GET', url, **kwargs)
r = requests.request('HEAD', url, **kwargs)
r = requests.request('POST', url, **kwargs)
r = requests.request('PUT', url, **kwargs)
r = requests.request('PATCH', url, **kwargs)
r = requests.request('delete', url, **kwargs)
r = requests.request('OPTIONS', url, **kwargs)
其中**kwargs: 控制访问的参数有下面这些
| 参数 | 说明 |
|---|---|
| params | 字典或字节序列,作为参数增加到url中 |
| data | 字典、字节序列或文件对象,作为Request的内容 |
| json | JSON格式的数据,作为Request的内容 |
| headers | 字典,HTTP定制头 |
| cookies | 字典或CookieJar,Request中的cookie |
| auth | 元组,支持HTTP认证功能 |
| files | 字典类型,传输文件 |
| timeout | 设定超时时间,秒为单位 |
| proxies | 字典类型,设定访问代理服务器,可以增加登录认证 |
| allow_redirects : | True/False,默认为True,重定向开关 |
| stream | True/False,默认为True,获取内容立即下载开关 |
| verify | True/False,默认为True,认证SSL证书开关 |
| cert | 本地SSL证书路径 |
params 例子
>>> kv = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.request('GET', 'http://python123.io/ws', params=kv)
>>> print(r.url)
http://python123.io/ws?key1=value1&key2=value2
data 例子
>>> kv = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.request('POST', 'http://python123.io/ws', data=kv)
>>> body = '主体内容'
>>> r = requests.request('POST', 'http://python123.io/ws', data=body)
json 例子
>>> kv = {'key1': 'value1'}
>>> r = requests.request('POST', 'http://python123.io/ws', json=kv)
headers 例子
>>> hd = {'user‐agent': 'Chrome/10'}
>>> r = requests.request('POST', 'http://python123.io/ws', headers=hd)
files 例子
>>> fs = {'file': open('data.xls', 'rb')}
>>> r = requests.request('POST', 'http://python123.io/ws', files=fs)
timeout 例子
>>> r = requests.request('GET', 'http://www.baidu.com', timeout=10)
proxies 例子
>>> pxs = { 'http': 'http://user:pass@10.10.10.1:1234'
'https': 'https://10.10.10.1:4321' }
>>> r = requests.request('GET', 'http://www.baidu.com', proxies=pxs)
异常处理
| 异常 | 说明 |
|---|---|
| requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
| requests.HTTPError | HTTP错误异常 |
| requests.URLRequiredURL | 缺失异常 |
| requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
| requests.ConnectTimeout | 连接远程服务器超时异常 |
| requests.Timeout | 请求URL超时,产生超时异常 |
其中ConnectTimeout和Timeout的区别是一个是连接服务器的过程中的超时,另一个是整个发起请求的过程超时(包括与服务器连接前后所需要的时间) |
r.raise_for_status()函数
如果返回的状态码不是200,则产生requests.HTTPError异常
一个爬取网页的代码框架

一个爬取网页图片并保存的代码案例




浙公网安备 33010602011771号