Python网络爬虫与信息提取(二)——HTTP协议及Requests库的方法

时间:2024-04-17 17:44:19

HTTP协议及Requests库的方法

HTTP: Hypertext Transfer Protocol,超文本传输协议

HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。也就是用户发出请求,服务器给出响应。无状态是指第一次请求与第二次请求之间并没有相关关联。应用层协议工作在TCP协议之上。

HTTP协议采用URL作为定位网络资源的标识。

URL格式:http://host[:port][path]

         host域合法的Internet主机域名或IP地址

         port域:端口号(可省),缺省端口为80

         path域:请求资源的路径。资源在这样的主机或IP地址的服务器上所包含的内部路径

eg:  http://www.bit.edu.cn 表示北京理工大学的校园网的首页

    http://220.181.111.188/duty 指的是这样一台IP主机上,duty目录下的相关资源

HTTP URL的理解:URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。就像电脑的一个文件一样,不过这个资源不在电脑上,而在Internet上。

HTTP协议对资源的操作

方法

说明

GET

请求获取URL位置的资源

HEAD

请求获取URL位置资源的响应消息报告,即获得该资源的头部信息(当资源很大时,难以完全拿下或者拿下的代价很大时,可以请求HEAD,能够获得头部信息,并且分析资源的大概内容)

POST

请求向URL位置的资源后附加新的数据。不改变URL位置现有的内容,在后面新增用户提交的资源

PUT

请求向URL位置存储一个资源,覆盖原URL位置的资源

PATCH

请求局部更新URL位置的资源,即改变该处资源的部分内容

DELETE

请求删除URL位置储存的资源

6个方法就是requests库提供的6个主要函数所对应的功能。

HTTP通过这6中方法对资源进行管理,每次操作时是独立的,无状态的。

HTTP协议的世界里,网络通道和服务器都是黑盒子,它能看到的就是URL链接,以及对URL链接的相关操作。

理解PATCHPUT的区别:

假设URL位置有一组数据UsreInfo,包括UserIUserName20个字段。

需求:用户修改了UserName,其他不变

1:采用PATCH,仅向URL提交UserName的局部更新请求。

2:采用PUT,必须将所有20个字段一并提交到URL,未提交字段将被删除

PATCH最主要好处:节省网络带宽

 

HTTP协议与Requests

HTTP协议方法

Requests库方法

功能一致性

GET

requests.get()

一致

HEAD

requests.head()

一致

POST

requests.post()

一致

PUT

requests.put()

一致

DELETE

requests.delete()

一致

PATCH

requests.patch()

一致

 

 

Requests库的head()方法

 

注:倒数第二行多打了一个2(⊙﹏⊙)

 

Requests库的post()方法

 

 

 

requests.request(method,url,**kwargs)

method: 请求方式,对应get/put/post7

url : 拟获取页面的URL链接

**kwargs: 控制访问参数,共13

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)

OPTIONS:向服务器获取跟服务器打交道的参数,并不与获取资源直接相关,因此使用较少

 

**kwargs:控制访问参数(13个),均为可选项

   1:params 字典或字节序列,作为参数增加到url

     

  2data 字典、字节序列或文件对象,作为Request的内容

 

  3json : JSON格式的数据,作为Request的内容,向服务器提交

JSONHTTP,HTML相关的web开发中非常常见,也是HTTP协议最经常使用的数据格式

 

 

4headers : 字典,HTTP定制头。对应于向某个url访问时所发起的HTTP的头字段。

      就是可以使用这个字段来定制访问某一个urlHTTP协议头

 

5cookies: 字典或CookieJarRequest中的cookie

6auth : 元组,支持HTTP认证功能

7files :字典类型,向服务器传输文件

fs={‘file’:open(‘data.xls’,’rb’)}  #file与对应的文件做键值对,用open()方式打开这个文件

r=requests.request(‘POST’,’http://python123.io/ws’,file=fs)  #可以向某一个链接提交一个文件

8timeout: 设定的超时时间,以秒为单位

 

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地址信息,能够有效的防止对爬虫的逆追踪

虽然我写的时候显示TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。(⊙﹏⊙)

10allow_redirects :  True/False,默认为True,重定向开关,表示是否允许对url进行重定向

11stream : True/False ,默认为True,获取内容立即下载开关,表示对获取的内容是否立即下载

12verify : True/False,默认为True,认证SSl证书开关,

13cert: 保存本里SSL证书路径的字段

 

requests.get(url,params=None,**kwargs)

Url :拟获取页面的url链接

params :url中的额外参数,字典或字节流格式,可选

**kwargs :12个控制访问参数(除params外),与request()完全一样

 

requests.head(url,**kwargs)

**kwargs:13个控制访问参数,与request()一样

 

requests.post(url,data=None,json=None,**kwargs)

**kwargs:data,json外,与request()一样

 

requests.put(url,data=None,**kwargs)

**kwargs:data外,与request()一样

 

requests.patch(url,data=None,**kwargs)

**kwargs:data外,与request()一样

 

requests.delete(url,**kwargs)

**kwargs: request()一样

 

其实这6个方法都可以使用request()直接实现,不过每个要实现的操作都有经常使用的控制访问参数,那么这6个方式就是将经常使用的控制访问参数显式化