博客简介
对于小规模的网页我们常用Requests库来进行爬取,本篇博客介绍的是网络爬虫常用到的Requests库,以及使用get方法的基本框架和异常处理,内容如下:
- http协议
- Requests库方法
- Response对象的属性
- 异常处理
- 爬虫基本框架
http协议
HTTP , Hypertext Transfer Protocol ,超文本传输协议。是一个基于“请求与响应”模式的、无状态的应用层协议,HTTP协议采用URL作为定位网络资源的标识,URL是通过HTTP协议存取资源的Internet路径, -一个URL对应-个数据资源
- URL格式如:
http://host[ :port] [path]
- host:合法的Internet主机域名或IP地址
- port:端口号,缺省端口为80
- path:请求资源的路径
https://www.baidu.com/
http://220.181.111.188/ duty
HTTP协议对资源的操作
HTTP协议对资源有种方法:
方法 | 属性 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
Requests库方法
Requests库有许多方法,其中常用的是以下7种,功能与http协议一一对应,其中request方法是其他6种方法的基础,可以指定request方法中的method参数类型,即可实现相应的子功能。但是使用子方法更为直观:
方法 | 属性 |
---|---|
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 |
requests.request() 方法以及参数属性
requests.request()是Requests库的基础方法,其包含了3个参数:requests.request(method,url,**kwargs)
- method : 请求方式
GET/HEAD/PUT/POST/PATCH/delete/OPTIONS
- url:资源访问URL
**kwargs
:控制访问的参数,可选,需要用关键字方式指定参数,13个可选参数如下:
参数 | 属性 |
---|---|
params | 字典或字节序列,作为参数增加到ur1中 |
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证书路径 |
- 举例:
r=requests.request('GET'https://www.csdn.net/')
#timeout
r=requests.request('GET'https://www.csdn.net/',timeout=10)
#params
kv={
'key1':'value1',
'key2':'value2'
}
r = requests.request('GET', 'https://www.csdn.net/',params=kv)
#data
body='text,主体内容'
r = requests.request('POST', 'https://www.csdn.net/',data=body)
#json
kv={
'key1':'value1'
}
r = requests.request('POST', 'https://www.csdn.net/',json=kv)
#headers
hd={
'user-agent':'Chrome/10'
}
r=requests.request('POST','https://www.csdn.net/',headers=hd)
#files
fs={'files':open('data.xsl','rb')}
r=requests.request('POST','https://www.csdn.net/',files=fs)
#proxies
pxs = { 'http': 'http://user:[email protected]:1234',
'https': 'https://10.10.10.1:4321'
}
r=requests.request('GET',' http://www.baidu.com',proxies=pxs)
requests.get()方法以及参数属性
- 调用形式:
requests.get(url,params=None,**kwargs)
- url:拟获取页面的ur1链接
- params:URL中的额外参数,字典或字节流格式,可选
** kwargs:
12个控制访问的参数:
参数 | 属性 |
---|---|
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证书路径 |
requests.head(url,**kwargs)
- 调用形式:
requests.head(url,**kwargs)
- url:拟获取页面的URL链接
**kwargs
:13个控制访问参数
参数 | 属性 |
---|---|
params | 字典或字节序列,作为参数增加到ur1中 |
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证书路径 |
requests.post()
- 调用方式:
requests.post(url,data=None,json=None,**kwargs)
- url:拟更新页面的ur1链接
- data:字典、字节序列或文件, Request的内容
- json: JSON格式的数据,Request的内容
**kwargs
: 剩余11个控制访问的参数(见request方法)
request.put()
- 调用方法:
request.put(url,data=None,**kwargs)
- url:拟更新页面的url链接
- data:字典、字节序列或文件,Request的内容
**kwargs:
剩余12个 控制访问的参数(见request方法)
request.patch()
- 调用方法:
request.patch(url,data=None,**kwargs)
- url:拟更新页面的url链接
- data:字典、字节序列或文件,Request的内容
**kwargs
: 12个 控制访问的参数(见request方法)
request.delete()
- 调用方法:
request.delete(url,**kwargs)
- url:拟删除页面的URL
**kwargs
: 13个 控制访问的参数(见request方法)
Response对象属性
r=requests.get(url)
当我们使用request方法获取信息之后,这个信息保存在一个Response对象中(r),我们可以访问这个对象的相应属性来获取信息,属性如下:
参数 | 属性 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP响应内容的字符串形式,即, ur1对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
- 举例:
def getinfomation1(url):
r=requests.get(url)
print(r.status_code)
print('r.encoding=',r.encoding)
print("r.apparent_encoding=",r.apparent_encoding)
r.encoding='utf-8'
print(r.headers)
print(r.text)
异常处理
为什么进行异常处理?网络链接有风险,异常处理很重要,Requests库的异常如下:
参数 | 属性 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
使用response对象的raise_for_status()方法
r.raise_ for_ status ()在方法内部判断r . status_ _code是否等于200 ,不需要增加额外的if语句,该语句便于利用try-except进行异常处理:
代码框架
import requests
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()#如果状态不是200,引发httpError异常
return r.text
except:
return '产生异常'
def main():
url='https://www.csdn.net/'
text=getHTMLText(url)
print(text)
if __name__ == '__main__':
main()