安装库
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: 捕获父类异常