python爬虫基础(二)Request库
相关内容:requests文档、Python 爬虫知识清单【更】
安装使用
- 安装
pip install requests
- 测试
import requests
r = requests.get('http://www.baidu.com')
r.status_code # 打印状态码,200
r.encoding # 编码 'utf-8'
r.text # 打印网页内容
# 发出一个requests,返回一个response
-
使用逻辑:发出一个request对象,得到返回的response对象
-
适用规模:小规模,爬取速度不敏感的任务
-
主要方法:request、get、head、post、put、patch、delete
1. Response对象
包含爬虫返回的全部内容
import requests
r = requests.get('http://www.baidu.com')
# r是一个requests.models.Response的类
1.1 属性
-
r.status_code
:HTTP请求的返回状态,200表示成功,404表示失败,先确定访问成功再进行后续操作或者属性的获取 -
r.text
:HTTP相应内容的字符串形式 -
r.encoding
:从HTTP header中猜测出来的相应内容编码方式 -
r.apparent_encoding
:从内容中分析出的响应内容编码方式(备选编码方式) -
r.content
:HTTP相应内容的二进制形式,如从url链接获得图片,资源用二进制存储,就可以用content还原图片 -
r.headers
:头部信息
1.2 response的编码
encoding属性是从header的charset中分析的,并不是所有服务器对资源编码形式都有要求,如果header中不存在charset,默认编码是ISO-8859-1,但是这个编码不能够解析中文,而apparent_encoding是根据内容分析判断可能的编码形式,比encoding相对来说更加准确
2. Request方法
2.1 requests.get(url, params=None, **kwargs):获取资源
2.1.1 函数原型
requests.get(url, params=None, **kwargs)
r = requests.get(url)
-
url:拟获取页面的url链接
-
params:url中的额外参数,字典或者字节流格式,可选的参数
-
**kwargs:12个控制访问的参数
2.1.2 源码
def get(url, params=None, **kwargs):
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
实际是封装了request方法
2.2 requests.request(method, url, **kwargs):提交请求
2.2.1 函数原型
requests.request(method, url, **kwargs)
-
method:请求方式,对应get/head/put/post/patch/delete/options等7种
-
url:拟获取页面的连接
-
**kwargs:13个控制方文的参数
2.2.2 控制参数
- params:字典或字节序列,作为参数增加到url中
kv = {'key1': 'value1', 'key2':'key2'}
r = requests.request('GET', 'http://python123.io/ws', params=kv)
print(r.url)
# http://python123.io/ws?key1=value1&key2=value2
- data:字典、字节序列、文件对象,作为request的内容,在提交资源的时候使用
kv = {'key1': 'value1', 'key2':'key2'}
r = requests.request('POST', 'http://python123.io/ws', data=kv)
kv数据会被存放在URL连接对应的位置
-
json:JSON格式的数据,作为Request的内容
-
headers:字典、HTTP定制头
可以通过重新设置user-agent将请求头模拟为浏览器请求,从而获取某些被来源审查拦截的请求
hd={'user-agent':'Chrome/10'}
r = requests.request('POST', 'http://python123.io/ws', headers=hd)
-
cookies:字典或CookieJar,Request中额cookie
-
Auth:元组,支持HTTP认证功能
-
files:字典类型,传输文件
fs = {'file':open('data.xls', 'rb')}
r = requests.request('POST', 'http://python123.io/ws', files=fs)
-
timeout:s为单位,如果timeout时间内没有返回,就获得timeout异常
-
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)
-
allow_redirects:True/False,允许重定向
-
stream:True/False,获取内容立即下载
-
verify:True/False,认证SSL证书
-
cert:本地SSL证书路径
2.3 其他方法
- head(url, **kwargs):获取头部数据
r = requests.head(url)
r.headers
- post(url, data=None, json=None, **kwargs):新增数据
payload = {'key1': 'value1', 'key2':'key2'}
r = requests.post(url, data=payload)
print(r.text)
# {..."form":{"key2":"value2", "key1":"value1"},...}
当向URL中POST字典或者键值对时,数据会被存储在表单的字段下
如果提交是字符串,那么会放在data字段下
-
put(url, data=None, **kwargs):与post一样,只是会覆盖
-
patch(url, data=None, **kwargs):与post一样
-
delete(url, **kwargs):删除资源
3. 通用代码框架
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
3.1 Request的常用异常
-
requests.ConnectionError
:网络连接错误异常,如果DNs查询失败、拒绝连接 -
requests.HTTPError
:HTTP错误异常 -
requests.URLRequired
:URL缺失异常 -
requests.TooManyRedirects
:超过最大重定向,复杂连接会出现这样的异常 -
requests.ConnectTimeout
:连接远程服务器超时异常,连接服务器的时间超出 -
requests.Timeout
:请求URL超时,产生超时异常,从发出URL开始算 -
r.raise_for_status()
:判断返回的状态码是不是200,否则产生HTTPError异常
4. HTTP 超文本传输协议
4.1 基本信息
-
应用层协议,请求和响应
-
采用URL作为定位网络资源的标识
-
url格式:http://host[:port=80][path]
4.2 HTTP协议对资源的操作
-
GET:请求获取URL位置的资源
-
HEAD:请求获取URL位置资源的响应报告,即或者资源的头部信息,当获得所有资源代价过大时可以只获取头部信息
-
POST:请求向URL位置的资源后附加新的资源
-
PUT:请求向URL位置存储一个资源,覆盖原URL位置的资源
-
PATCH:请求局部更新URL位置的资源,即改变该处资源的部分内容
-
DELETE:请求删除URL位置存储的资源
PATCH和PUT的区别:PATCH只需要上传需要修改的数据,PUT需要全部上传
方法和request库的方法一样
参考资料
中国大学MOOC - python网络爬虫与信息提取