python爬虫之requests库入门笔记

253 阅读4分钟

原先写爬虫都是采用的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_codeHTTP请求的返回状态,200表示连接成功,404表示失败
r.textHTTP响应内容的字符串形式,即,url对应的页面内容
r.encoding从HTTP header中猜测的响应内容编码方式
r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)
r.contentHTTP响应内容的二进制形式
import requests
r = requests.get("http://www.baidu.com")
type(r)
requests.models.Response
r.status_code

200

r.text

在这里插入图片描述

可以发现,r.text.属性得到的网页数据里面,中文没有正常的显示
在这里插入图片描述

从返回的数据了解到r.encodingISO-8859-1,因为r.encoding的值来源于headercharset属性
如果header中不存在charset,则认为编码为ISO‐8859‐1
查看r.headers

r.headers

{‘Content-Type’: ‘text/html’, ‘Content-Encoding’: ‘gzip’}

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的内容
jsonJSON格式的数据,作为Request的内容
headers字典,HTTP定制头
cookies字典或CookieJar,Request中的cookie
auth元组,支持HTTP认证功能
files字典类型,传输文件
timeout设定超时时间,秒为单位
proxies字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects :True/False,默认为True,重定向开关
streamTrue/False,默认为True,获取内容立即下载开关
verifyTrue/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.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
requests.TooManyRedirects超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超时异常

其中ConnectTimeoutTimeout的区别是一个是连接服务器的过程中的超时,另一个是整个发起请求的过程超时(包括与服务器连接前后所需要的时间)

r.raise_for_status()函数

如果返回的状态码不是200,则产生requests.HTTPError异常

一个爬取网页的代码框架

在这里插入图片描述

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

在这里插入图片描述