Python爬虫——Requests库
Requests库
-
HTTP协议
在说爬虫之前,先了解了解什么是HTTP协议。
HTTP–Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。
URL格式:http://host [:port][path]
host: 合法的Internet主机域名或IP地址
port:端口号,缺省则为80path:请求资源的路径
HTTP协议对资源的操作
GET,HEAD,POST, PUT, PATCH, DELETE(请自行查阅相关资料)
在这里强调一下GET与POST的区别:
- GET方式可以通过URL提交数据,待提交的数据是URL的一部分;采用POST方式,待提交的数据放置在HTML HEADER内
- GET方式提交的数据最多不超过1024字节,POST没有对提交内容的长度限制
- 安全性问题。使用GET时参数会显示在URL中,而POST不会。所以,如果这些数据是敏感数据,建议采用POST方式
-
什么是Requests库?
requests库是一个简洁且简单的处理HTTP请求的第三方库。
由于是第三方库,所以需要自行安装,pip install requests即可。
-
Requests库的主要方法
方法 描述 .request() 构造一个请求,以支持以下各种方法 .get() 获取HTML网页的主要方法,对应GET请求 .head() 获取HTML网页头信息 .post() 提交POST请求 .put() 提交PUT请求 .patch() 提交局部修改请求 .delete() 提交删除请求 关于GET,POST,PUT等方法,请自行学习HTML中的GET,POST,PUT等请求,便于加深理解。
-
什么是response对象
和浏览器的交互一样,request.get()等方法代表请求过程,它返回的Response对象代表响应。返回内容作为一个对象以便操作。
-
Respon对象的常用属性与方法
属性 描述 r.status_code 请求返回状态,200(成功),404(失败) r.text 响应内容的字符串形式,即URL的页面内容 r.encoding 从HTTPheader中猜测的响应内容编码方式 r.apparent_encoding 从内容分析出的响应内容的编码方式 r.content 响应内容的二进制形式 r.headers 响应内容的头部信息 r.url 返回请求的URL
方法 | 描述 |
---|---|
r.json() | 如果HTTP响应内容包含JSON格式数据,则用该方法解析JSON数据 |
r.raise_for_status | 如果访问状态不是200,则产生HTTPError异常 |
注:HTTPheader中的charset字段记录了响应内容的编码方式,如果为空,则默认编码方式为“ISO-8859-1”,
直接打印内容会出现乱码,需要修改其编码方式。可通过r.encoding = r.apparent_encoding修改。
>>> import requests #import Requests库
>>> r = requests.get("https://wwww.baidu.com") #使用get方法打开百度链接
>>> type(r) #返回的是response对象
<class 'requests.models.Response'>
>>> r.status_code #查看请求状态
200
>>> r.text[:50] #响应内容
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><met'
>>> r.encoding #编码方式
'ISO-8859-1'
>>> r.apparent_encoding #从内容分析出的编码方式
'utf-8'
>>> r.content #响应内容的二进制形式
-
Requests库的常用异常
异常 描述 ConnectionError 网络连接错误异常 HTTPError HTTP错误 URLRequired URL缺失异常 TooManyRedirects 超过最大重定向次数 ConnectTimeout 链接远程服务器超时 Timeout 请求URL超时 -
一般网页爬取的通用框架(用于练习的小程序)
def getHTMLText(url): try: r = requests.get(url, timeout = 30) r.raise_for_status r.encoding = r.apparent_encoding return r.text except: return "爬取异常"
-
request方法详细参数
requests.request(method,url,**kwargs)
method:指请求类型即,GET,POST,PUT等。
URL:访问的URL
**kwarys,包含13个参数,以下是其详细说明
params: 字典或字节序列,作为参数增加到URL中
data: 字典,字节序列或文件对象,作为Request的内容
JSON : JOSN格式的数据,作为Request的内容headers:字典,HTTP定制头(模拟浏览器进行访问)
cokies:字典或CpplieJar,Request中的cookie
auth: 元组,支持HTTP认证功能
files:字典类型,传输文件
timeout: 设定超时时间,秒为单位
proxies: 字典类型,设定访问代理服务器,可以增加登陆认证
allow_redirects: True//False,默认为True,重定向开关
stream: True/False,默认为True,获取内容立即下载开关
verify: True/False,默认为True,认证SSL证书开关注意:Requests库的其他请求方法,都是对request方法的封装
请看GET的源代码:
def get(url, params=None, **kwargs): r"""Sends a GET request. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary, list of tuples or bytes to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response <Response>` object :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) return request('get', url, params=params, **kwargs) #通过调用request方法,得到get方法的返回值
讲了这么多,现在就来看看代码吧!
1.最基本的GET方法
requests.get(url, params = None, **kwargs)
其中params默认为None
>>> import requests >>> r = requests.get("https://www.baidu.com") >>> r.status_code 200 >>> r.encoding = r.apparent_encoding >>> r.text
带参数的GET方法
>>> r = requests.get("https://www.baidu.com/s?wd=Python") >>> r.status_code 200 >>> r.encoding = r.apparent_encoding >>> r.text
2.通过params参数可以达到同样的目的,params为字典类型,增加到URL中。
>>> data = {"wd" : "Python"} >>> r=requests.get("https://www.baidu.com/s?", params = data) >>> r.status_code 200 >>> r.url 'https://www.baidu.com/s?wd=Python'
上述两种的结果是相同的,通过params参数传递一个字典内容,从而直接构造url
注意:第二种方式通过字典的方式的时候,如果字典中的参数为None则不会添加到url.3.解析JSON
注意需要导入json库,下面看代码:
>>> import json >>> import requests >>> r = requests.get("https://www.baidu.com") >>> r.status_code 200 >>> r.json() >>> #如果HTTP响应内容包含JSON格式数据,则用该方法解析JSON数据 #以上代码会报错,原因是HTTP响应内容没有JSON格式数据。这里只是演示一下。
4.获取二进制数据
使用r.content
主要用于获取视频图片等二进制资源。
5.提交Headers
直接访问某些网站(如,知乎)是无法访问的,原因之一是其URL需要提交headers
>>> import requests >>> r = requests.get("https://www.zhihu.com") >>> r.status_code 400 #出现400,表示访问出错
Chrome的用户代理如下:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
将Chrome的头部信息添加到get中,注意使用字典格式
>>> import requests >>> headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"} >>> r = requests.get("https://www.zhihu.com", headers = headers) >>> r.status_code 200 #User-Agent,用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等
6.POST请求
requests.post(url, data = None, json = None, **kwargs)
通过在发送post请求时添加一个data参数,data参数为字典类型。
>>> data = {"name":"germey", "age":"23"} >>> r = requests.post("http://httpbin.org/post", data = data) >>> r.status_code 200 >>> r.text '{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "age": "23", \n "name": "germey"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Connection": "close", \n "Content-Length": "18", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.20.0"\n }, \n "json": null, \n "origin": "113.251.223.127", \n "url": "http://httpbin.org/post"\n}\n'
在form字段中就添加了data数据
以上就是Requests库的基本用法。
下面附上几个mooc上的小实例
转载请注明:https://blog.csdn.net/qq_43544492
Requests库的更多用法,可以参考Requests库的官方文档:http://docs.python-requests.org