request库的使用

安装库

pip install requests

导入库

import requests

发送简单的请求

response = requests.get(url)

response的集中常用方法

response.text: 返回文本的形式响应内容
response.content.decode('UTF-8'):返回相应的页面,可以修改编码方式
response.content: 返回二进制形式响应内容
response.status_code: 返回状态码(中断码)
response.request.headers: 查看请求头
response.headers: 查看响应头
response.request.url: 查看请求地址
response.url: 查看响应地址(如果请求的时候服务器发生跳转,怎请求地址和响应地址不一样)
response.encoding: 网页编码
response.apparent_encoding: 网页的备用编码

判断请求是否成功

assert response.status_code == 200	# 判断断言(状态码)是否为真

如果为 “真” 不反应,为 “假” 则报错

发送带参数的请求

参数的形式:字典
kw = {‘wd’:‘长城’}
用法:requests.get(url, params=kw)

url编码

URL编码和 “utf-8”、“jbk” 不同,它是一种独立的编码,需要用到解码工具

解决response乱码问题

response.encoding = response.apparent_encoding

POST请求

用法

response = requests.post(url, data=data, header=header)

data 的类型:字典
data = {‘wd’:‘长城’}

使用代理

用法

respons = requests.get(url, proxies=proxies)

proxies的形式:字典

proxies = {"http":"http://IP:端口号","https":"https://IP:端口号"}

检查ip可用性

  • 检查ip的可用性,可以设置requests的timeout(链接超时)
  • 组建ip代理池,随机选一个

状态码判断

常见的网页状态码
信息,服务器收到请求,需要请求者继续执行操作

100: (继续。客户端应继续其请求)
101: (切换协议)

成功,操作被成功接收并处理

200: (请求成功。一般用于GET与POST请求)
201: (已创建。成功请求并创建了新的资源)
202: 已接受。已经接受请求,但未处理完成
203: 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204: 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205: 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206: 部分内容。服务器成功处理了部分GET请求

重定向,需要进一步的操作以完成请求

300: 多种选择。请求的资源可包括多个位置
301: 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302: 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303: 查看其它地址。与301类似。使用GET和POST请求查看
304: 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。
305: 使用代理。所请求的资源必须通过代理访问
306: 已经被废弃的HTTP状态码
307: 临时重定向。与302类似。

客户端错误,请求包含语法错误或无法完成请求

400: 客户端请求的语法错误,服务器无法理解
401: 请求要求用户的身份认证
402: 保留,将来使用
403: 服务器理解请求客户端的请求,但是拒绝执行此请求
404: 服务器无法根据客户端的请求找到资源(网页)。
405: 客户端请求中的方法被禁止
406: 服务器无法根据客户端请求的内容特性完成请求
407: 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408: 服务器等待客户端发送的请求时间过长,超时
409: 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410: 客户端请求的资源已经不存在。
411: 服务器无法处理客户端发送的不带Content-Length的请求信息
412: 客户端请求信息的先决条件错误
413: 由于请求的实体过大,服务器无法处理,因此拒绝请求。
414: 请求的URI过长(URI通常为网址),服务器无法处理
415: 服务器无法处理请求附带的媒体格式
416: 客户端请求的范围无效
417: 服务器无法满足Expect的请求头信息

服务器错误,服务器在处理请求的过程中发生了错误

500: 服务器内部错误,无法完成请求
501: 服务器不支持请求的功能,无法完成请求
502:作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503: 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504: 充当网关或代理的服务器,未及时从远端服务器获取请求
505: 服务器不支持请求的HTTP协议的版本,无法完成处理

高级操作

用POST方法传文件

files = {'file': open('request.txt', 'rb')}
# 通过files参数传入post方法中,实现文件的上传
response = requests.post("http://httpbin.org/post", files=files)
print(response.text)

获取cookie

response = requests.get("http://www.baidu.com")
print(response.cookies)
for key, value in response.cookies.items():
   print(key + '=' + value)

模拟登陆

通过声明Session对象来发起两次get请求,视为一个浏览器中进行的操作:

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
# 通过cookies/set方法来设置cookie
response = s.get('http://httpbin.org/cookies')
print(response.text)

证书验证

关闭验证ssl证书

如果我们要爬取的是一个 https 协议的网站,那么网站首先会检查证书是否是合法的,若非法,会直接抛出 SSLError 错误。如果要避免这种错误的话,可以把这个参数:verify设置为 False* 就可以了(默认是True)。

response = requests.get('https://www.12306.cn',verify=False)  #把verify参数置否

这样就返回了200的状态码,但是仍然会有警告信息,提示你最好加上证书验证。那么怎么消除这个警告信息呢?
可以从原生包中导入 urllib3 并使用其中的禁用警告这个方法:

import requests
from requests.packages import urllib3
urllib3.disable_warnings()#禁用警告信息
response=requests.get('https://www.12306.cn',verify=False)
print(response.status_code)

添加证书

response=requests.get('https://www.12306.cn',cert("证书路径"))

认证设置

有的网站在访问时需要输入用户名和密码,输入之后才能看到网站的内容。
如果遇到这种网站,我们可以通过auth参数,把用户名和密码传入。

import requests
from requests.auth import HTTPBasicAuth

r=requests.get(URL,auth=HTTPBasicAuth('user','password'))
#通过auth参数传入。
print(r.status_code)

超时设置

利用timeout参数实现超时设置

response=requests.get("https://www.taobao.com",timeout=1)
#设置一个时间限制,必须在1秒内得到应答

如果时间超出了限制,就会抛出异常。怎么捕获这个异常呢?

import requests
from requests.exceptions import ReadTimeout

try:
	response=requests.get("https://httpbin.org/get",timeout=0.5)
	print(response.status_code)
except ReadTimeout:
	print('Timeout')

成功捕获了这个异常,并进行处理(报信息)。

异常处理

异常处理可以保证你的爬虫不间断地运行。原则是先捕获子类异常,再捕捉父类异常(RequestException)。
ReadTimeout: 捕获超时异常
HTTPError: 捕获HTTP异常
ConnectionError: 捕获连接异常
RequestException: 捕获父类异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋禊

兴趣才是前进路上最亮的灯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值