Loading

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.encodingISO-8859-1,因为r.encoding的值来源于headercharset属性
如果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超时,产生超时异常
其中ConnectTimeoutTimeout的区别是一个是连接服务器的过程中的超时,另一个是整个发起请求的过程超时(包括与服务器连接前后所需要的时间)

r.raise_for_status()函数

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

一个爬取网页的代码框架

在这里插入图片描述

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

在这里插入图片描述

posted @ 2021-03-26 12:22  克豪  阅读(106)  评论(0)    收藏  举报