赞
踩
本文为北理嵩天老师《网络爬虫与信息提取》学习笔记。
一、Requests库简介一
二、爬取网页的通用代码框架
三、HTTP协议及Requests库方法
3.1HTTP协议:
3.2Requests库主要方法解析:
(一)requests.request(method,url,**kwargs)
(二)requests.get(url,params=None,**kwargs)
(三)requests.head(url,**kwargs)
(四)requests.post(url,data=None,json=None,**kwargs)
(五)requests.put(url,data=None,**kwargs)
(六)requests.patch(url,data=None,**kwargs)
(七)requests.delete(url,**kwargs)
Requests库主要有七个方法:
1.requests.request()
构造一个请求,支撑以下各方法的基础方法(以下的方法都是通过调用该方法实现的)
2.requests.get()
获取HTML网页的主要方法,对应于HTTP的GET
3.requests.head()
获取HTML网页头信息的方法,对应于HTTP的GET
4.requests.post()
向HTML网页提交POST请求的方法,对应于HTTP的POST
5.requests.put()
向HTML网页提交PUT请求的方法,对应于HTTP的PUT
6.requests.patch()
向HTML网页提交局部修改请求,对应于HTTP的PATCH
7.requests.delete()
向HTML页面提交删除,对应于HTTP的DELETE
*requests.get(url,params=None,*kwargs)
其参数大致如下:
(1) url:拟获取页面的url链接
(2) params:url中的额外参数,字典或字节流格式,可选
(3) **kwargs:12个控制访问的参数,可选
Requests库中两个最重要的对象即可通过requests.get()方法来认识:
r=requests.get(url)
(1) requests.get(url):构造一个向服务器请求资源的Request对象
(2) r:requests.get(url)的返回内容,返回一个包含服务器资源的Response对象
>>> type(r)
<class 'requests.models.Response'>
Response对象包含服务器返回的所有信息,同时它也包含了我们去向服务器请求的Request信息
Response对象常用的五个属性
(1) r.status_code: HTTP请求的返回状态,200表连接成功,404表示失败
(2) r.text: HTTP相应内容的字符串形式,即url对应的页面内容
(3) r.encoding: 从HTTP header中猜测的响应内容编码方式
(4) r.apparent_encoding : 从内容中分析出的响应内容编码方式(备选编码方式)
(5) r.content: HTTP响应内容的二进制形式(从网页中获得的图片是以二进制形式存储的,可通过此属性还原图片)
r.apparent_encoding和r.encoding之间的区别需要弄清,可通过下面一个例子来看看:
>>> import requests
>>> r=requests.get('https://www.baidu.com') #获取对应的HTTP页面
>>> r.status_code #查看请求的返回状态
200
>>> r.text #查看获取的页面内容
输出的内容大致如下:
对于人脑的理解机制来说,这里面几乎没有什么有价值的内容,我们网络爬虫肯定不是为了抓这些东西。
这时,需查看一下网页内容的编码:
>>> r.encoding #查看编码
'ISO-8859-1'
>>> r.apparent_encoding #查看从内容中分析出的响应内容的编码方式
'utf-8'
r.apparent_encoding得到的编码与 r.encoding得到的编码并不一致,这是因为r.encoding并没有分析网页内容,它只是根据headers中的信息,猜测网页的编码方式,如果headers中不存在charset,则认为编码为ISO-8859-1(但这样的编码并不能解析中文)。
>>> r.headers #返回GET请求获得页面的头部信息
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Fri, 10 Apr 2020 02:38:12 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:24:33 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
而r.apparent_encoding是根据网页内容来分析编码方式,它比r.encoding更加准确。
>>> r.encoding='utf-8' #替换原来的编码方式
>>> r.text #再输出,就能看到中文字符
将r.apparent_encoding得到的编码方式赋给r.encoding,便可以读到人类可以理解的内容了。
代码框架即一组代码,它可以准确地爬取网页的内容。
如果单用requests.get()不一定能抓取,因为网络连接有风险,异常处理很重要。
Requests库支持六种常用的连接异常
(1) requests.ConnectionError:网络连接错误异常,如DNS查询失败、拒绝连接等
(2) requests.HTTPError:HTTP错误异常
(3) requests.URLRequired:URL缺失异常
(4) requests.TooManyRedirects:超过最大重定向次数,产生重定向异常
(5) requests.ConnectTimeout:连接远程服务器超时异常
(6) requests.Timeout:请求URL超时,产生超时异常(发出请求到获得内容的整个过程的超时异常)
r.raise_for_status() 方法
由Response提供的一个方法,专门处理异常的方法,判断r.status_code的状态码,如果不是200,产生异常requests.HTTPError
以下为使用r.raise_for_status()方法的爬虫通用代码框架:
import requests
def getHTMLText(url):
try:
r=requests.get(url,timeout=30) #请求一个url链接
r.raise_for_status() #如果状态不是200,引发HTTPError异常
r.encoding=r.apparent_encoding #替代r.encoding,使得返回内容的解码是正确的
return r.text
except:
return "产生异常"
if __name__ =="__main__":
url="https://www.baidu.com"
print(getHTMLText(url))
理解HTTP协议有助于更好地理解Requests库中的方法。
HTTP:Hypertext Transfer Protocol 超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。
(1) “请求与响应”模式:用户发起请求,服务器做相关响应;
(2) “无状态”:第一次请求与第二次请求间并没有相关的关联;
(3) “应用层协议”:该协议工作在HTTP协议之上
HTTP协议一般采用URL作为定位网络资源的标识
URL格式: https://host[:port][path]
(1) host:合法的Internet主机域名或IP地址
(2) port:端口号,缺省端口为80
(3) path:请求资源的路径
例如:
https://www.bit.edu.cn 北理校园网首页
https://220.181.111.188/duty 这样一台IP主机上duty目录下的相关资源
HTTP URL的理解:
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
HTTP协议对资源的操作主要有6个
(1) GET:请求获取URL位置的资源
(2) HEAD:请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
(3) POST:请求向URL位置的资源后附加新的数据
(4) PUT:请求向URL位置存储一个资源,覆盖原URL位置的资源
(5) PATCH:请求局部更新URL位置的资源,即更改该处资源的部分内容
(6) DELETE:请求删除URL位置存储的资源
这六个操作即为Requests提供的函数所对应的主要功能。
这六个方法可以分三类:
PATCH和PUT的区别:
假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段,用户修改了UserName,其他不变,在对应URL位置更新:
(1) 采用PATCH,仅向URL提交UserName的局部更新请求。
(2) 采用PUT,必须将所有20个字段一并提交到URL,否则未提交的信息会被新的提交覆盖。
比较之下,PATCH可节省网络资源的带宽。
HTTP协议通过URL对资源做定位,通过这六个常用的方法对资源进行管理,每次操作都是独立无状态的,前后两次操作并没有关系。在HTTP协议的世界,网络通道和服务器都是黑盒子,它能看到的就是URL链接,以及对URL链接的操作。
head方法可用很少的网络流量,获得网络资源的概要信息:
>>> r=requests.head('http://httpbin.org/get')
>>> r.headers #展示头部信息的内容
{'Date': 'Fri, 10 Apr 2020 12:38:40 GMT', 'Content-Type': 'application/json', 'Content-Length': '308', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}
>>> r.text #展示全部信息,输出空
''
POST方法会根据用户提交内容的不同,在服务器上会做出相关的整理。
当我们向URL去POST一个字典或一个键值对时,键值对会默认地被存储到表单的字段下:
>>> payload={'key1':'value1','key2':'value2'}
>>> r=requests.post('http://httpbin.org/post',data=payload) #向URL添加信息
>>> print(r.text)
如果提交字符串,它被存到了data的字段下:
>>> r=requests.post('http://httpbin.org/post',data='ABC')
>>> print(r.text)
PUT方法与POST方法类似,只不过它能将原有的数据覆盖的:
>>> r=requests.put('http://httpbin.org/put',data=payload) #向URL添加信息
>>> print(r.text)
(1) method:请求方式,对应get/put/post等7种
r=requests.requests(‘GET’,url,**kwargs)
r=requests.requests(‘HEAD’,url,**kwargs)
r=requests.requests(‘POST’,url,**kwargs)
r=requests.requests(‘PUT’,url,**kwargs)
r=requests.requests(‘PATCH’,url,**kwargs)
r=requests.requests(‘delete’,url,**kwargs)
r=requests.requests(‘OPTIONS’,url,**kwargs):向服务器获取一些服务器和客户端能够打交道的参数,但与获取资源并不直接相关
(2) url:拟获取页面的url链接
**(3) kwargs:控制访问的参数,共13个,均为可选项
1.params:字典或字节序列,作为参数增加到url中
>>> import requests
>>> kv={'key1':'value1','key2':'value2'}
>>> r=requests.request('GET','https://www.baidu.com',params=kv)
>>> print(r.url)
https://www.baidu.com/?key1=value1&key2=value2
字典里的值加在了问号后面,即通过这样一些参数可以把一些键值对增加到url中,使得再次访问时,不止访问这个资源,同时带入一些参数,并根据这些参数筛选一些数据返回回来。
2.data:字典、字节序列或文件对象,作为Request的内容
>>> import requests
>>> kv={'key1':'value1','key2':'value2'}
>>> r=requests.request('POST','https://www.baidu.com',data=kv)
>>> body="主体内容"
>>> r=requests.request('POST','https://www.baidu.com',data=body.encode('utf-8'))
data中的内容(字符串、键值对等)会被存到URL链接所对应的位置
3.json:JSON格式的数据,作为Requests的内容
JSON格式在HTTP和HTML相关的web开发中非常常见,是HTTP协议最经常使用的数据格式,它也可以作为内容向服务器提交
>>> kv={'key1':'value1','key2':'value2'}
>>> r=requests.request('POST','https://www.baidu.com',json=kv)
4.headers:字典,HTTP定制头
可以用该字段定制某个访问URL的HTTP协议的头
>>> r=requests.request('https://www.baidu.com.cn',headers=headers)
>>> r=requests.request('https://www.baidu.com.cn',headers=headers)
将定制的值赋给headers,此时headers再去访问服务器,服务器看到的user-agent字段即为Chrome/10(Chrome浏览器的第十个版本)
5.cookies:字典或CookieJar,Request中的cookie (为Requests库的高级功能)
(从HTTP协议中解析cookies)
6.auth:元组类型,支持HTTP认证功能 (为Requests库的高级功能)
7.files:为字典类型,是向传输文件时使用的字段
>>> fs={'file':open('C:\\Users\\yuwei\\Desktop\\lala.txt','rb')}
>>> r=requests.request('POST','https://www.baidu.com',files=fs)
这样的方法用于向某个链接提交某个文件。
8.timeout:设定超时时间,秒为单位
在进行GET请求时可设定一个timeout时间,如果在timeout时间内,我们的请求内容没有返回回来,那么它将产生timeout的异常。
>>> r=requests.request('GET','https://www.baidu.com',timeout=10)
9.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)
设置一个http访问时的代理,在这个代理中增加一个对用户密码的设置;再增加一个https的代理服务器,这样在访问百度时,所使用的IP地址就是IP服务器的IP地址,使用这个字段可以有效地隐藏用户爬取网页时原来的IP地址信息,能有效地防止对爬虫的逆追踪。
10.allow_redirects:True/False,默认为True,重定向开关
这个字段是一个开关,表示允不允许对url进行重定向 (高级功能)
11.stream:True/False,默认为True,获取内容理解下载开关
该字段为一个开关,表示允不允许对获取的内容进行下载,默认情况是进行下载 (高级功能)
12.verify:True/False,默认为True,认证SSL证书开关
为认证SSL证书的字段 (高级功能)
13.cert:保存本地SSL证书路径的字段 (高级功能)
(1) url:拟获取页面的url链接
(2) params:url中的额外参数,字典或字节流格式,可选
同request()方法中的params
(3) **kwargs:12个控制访问的参数
request()中除了params以外的12个访问控制参数
get()方法为所有方法中最常用的方法,因为在HTTP协议中,向某个URL去提交资源的功能在服务器中是严格受控的。如果某个URL允许某个用户无限制地向服务器去传递资源,可能会引起污染网络空间等问题。
而对于某些非常大型的URL,可能需使用head()方法去获得它的概要信息。
(1) url:拟获取页面的url链接
(2) **kwargs:13个控制访问的参数
与request()完全一样
(1) url:拟更新页面的url链接
(2) data:字典、字节序列或文件,Request的内容
(3) json:JSON格式的数据,Request的内容
(4) **kwargs:11个控制访问的参数
除data和json之外的request中的其余11个
(1) url:拟更新页面的url链接
(2) data:字典、字节序列或文件,Request的内容
(3) **kwargs:12个控制访问的参数
除data之外的request中的其余12个
(1) url:拟更新页面的url链接
(2) data:字典、字节序列或文件,Request的内容
(3) **kwargs:12个控制访问的参数
除data和json之外的request中的其余12个
(1) url:拟更新页面的url链接
(2) **kwargs:13个控制访问的参数
除data和json之外的request中的其余13个
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。