网络爬虫:Requests库入门

本文为北理嵩天老师《网络爬虫与信息提取》学习笔记。
一、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库简介

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协议有助于更好地理解Requests库中的方法。

3.1HTTP协议:

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提供的函数所对应的主要功能。

这六个方法可以分三类:

  • 获得资源的方法主要是GET和HEAD,GET方法获得全部资源,HEAD方法获得资源的头部信息
  • 如果想把自己的资源放到URL位置的资源上,可以使用PUT、POST和PATCH方法
  • 如果想删掉URL位置上的资源可以用DELETE方法

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)

在这里插入图片描述

3.2Requests库主要方法解析:

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

(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证书路径的字段 (高级功能)

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

(1) url:拟获取页面的url链接
(2) params:url中的额外参数,字典或字节流格式,可选
同request()方法中的params
(3) **kwargs:12个控制访问的参数
request()中除了params以外的12个访问控制参数

get()方法为所有方法中最常用的方法,因为在HTTP协议中,向某个URL去提交资源的功能在服务器中是严格受控的。如果某个URL允许某个用户无限制地向服务器去传递资源,可能会引起污染网络空间等问题。
而对于某些非常大型的URL,可能需使用head()方法去获得它的概要信息。

(三)requests.head(url,**kwargs)

(1) url:拟获取页面的url链接
(2) **kwargs:13个控制访问的参数
与request()完全一样

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

(1) url:拟更新页面的url链接
(2) data:字典、字节序列或文件,Request的内容
(3) json:JSON格式的数据,Request的内容
(4) **kwargs:11个控制访问的参数
除data和json之外的request中的其余11个

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

(1) url:拟更新页面的url链接
(2) data:字典、字节序列或文件,Request的内容
(3) **kwargs:12个控制访问的参数
除data之外的request中的其余12个

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

(1) url:拟更新页面的url链接
(2) data:字典、字节序列或文件,Request的内容
(3) **kwargs:12个控制访问的参数
除data和json之外的request中的其余12个

(七)requests.delete(url,**kwargs)

(1) url:拟更新页面的url链接
(2) **kwargs:13个控制访问的参数
除data和json之外的request中的其余13个

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值