Python requests库
Requests库
Requests库:http://www.python-requests.org
安装requests库
requests库的7个主要方法
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础 |
requests.get() | 获取HTML网页的主要方法,对应的HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求方法,对应HTTP的POST |
requests.put() | 向HTML网页提交PUT请求方法,对应HTTP的PUT |
requests.patch() | 向HTML网页提交局部修改请求,对应HTTP的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应HTTP的DELETE |
Requests库的方法解析
1. requests.request(method, url, **kwargs)
method:请求方式,对应get/put/post等7种
- 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)
url:拟获取页面的url链接
**kwargs:控制访问的参数,共13个
-
params:字典或字节序列,作为参数增加到url中
-
data:字典、字节序列或文件对象,作为Request的内容
-
json:JSON格式的数据,作为Request的内容
-
headers:字典,HTTP定制头
-
cookies:字典或CookieJar,Request中的cookie
-
author:元组,支持HTTP认证功能
-
files:字典类型,传输文件
fs = {'file':open('data.xls','rb')} r = requests.request('POST','http://www.baidu.com',files=fs)
-
timeout:设定超时时间,秒为单位
r = requests.request('GET','http://www.baidu.com',timeout=10)
-
proxies:字典类型,设定访问代理服务器,可以增加登录认证(可隐藏用户爬取网页原的ip地址信息)
pxs = {'http':'http://user:pass@10.10.10.1:1234', 'http':'http://10.10.10.1:4321'} r = requests.request('GET','http://www.baidu.com',proxies=pxs)
-
allow_redirects:True/False,默认为True,重定向开关
-
stream:True/False,默认为True,获取内容立即下载开关
-
verify:True/False,默认为True,认证SSL证书开关
-
cert:本地SSL证书路径
2.requests.get(url, params=None, **kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或者字节流格式,可选
**kwargs:12个控制访问的参数
3.requests.head(url, **kwargs)
url:拟获取页面的url链接
**kwargs:13个控制访问的参数
4.requests.post(url, data=None, json=None, **kwargs)
url:拟获取页面的url链接
data:字典、字节序列或文件,Request的内容
json:JSON格式的数据,Request的内容
**kwargs:11个控制访问的参数
5.requests.put(url, data=None, **kwargs)
url:拟获取页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数
6.requests.patch(url, data=None, **kwargs)
url:拟获取页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数
7.requests.delete(url, **kwargs)
url:拟获取页面的url链接
**kwargs:13个控制访问的参数
例子:爬取百度的信息
Requests库的异常
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 远程连接服务器超时异常 |
requests.Timeout | 请求URL超时,产生的超时异常 |
理解Requests库的异常
异常 | 方法 |
---|---|
r.raise_for_status() | 如果不是200,产生异常requests.HTTPError |
爬取网页的通用代码框架
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()#如果不是200,产生requests.HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
if _name_ == "_main_":
url = "http://www.baidu.com"
print(getHTMLText(url))
HTTP协议及Requests库方法
HTTP协议
HTTP,Hypertext Transfer Protocol,超文本传输协议。
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。
HTTP协议采用URL作为定位网络资源的标识。
URL
URL是通过HTTP协议存储资源的Internet路径,一个URL对于一个数据资源。
URL格式 http://host[:port][path]
- host:合法的Internet主机域名或IP地址
- port:端口号,缺省端口为80
- path:请求资源的路径
HTTP协议对资源的操作
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部消息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源你的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
PATCH和PUT的区别
假设URL位置有一组数据UserInfo,包括UserID、UserName等
需求:用户修改了UserName,其他不变
- 采取PATCH,仅向URL提交UserName的局部更新请求。
- 采用PUT,必须将所有20个字段一并提交到URL,未提交的字段被删除。
PATCH的最主要的好处:节省网络带宽
实例:亚马逊商品页面的爬取
import requests
url = 'https://www.amazon.cn/dp/B07TPWBQ3Y?ref_=Oct_DLandingS_D_48449dee_60&smid=A26HDXW89ZT98L'
try:
kv = {'user-agent':'Mozilla/5.0'}
r = requests.get(url,headers=kv)#修改头部,改为Mozilla/5.0头部
r.raise_for_status() #如果不是200,产生requests.HTTPError异常
r.encoding = r.apparent_encoding#改为人类可阅读的编码
print(r.text[1000:2000]) #打印1000~2000行的信息
except:
print("爬取失败")
实例:百度360搜索关键字提交
百度的关键词接口:
http://www.baidu.com/s?wd=keyword
360的关键词接口:
import requests
keyword = "Python"
try:
kv = {'wd':'Python'}
r = requests.get("http://www.baidu.com/s",params=kv)#params:字典或字节序列,作为参数增加到url中
print(r.request.url)
r.raise_for_status()
print(len(r.text))
except:
print("爬取失败")
实例:网络图片的爬取与存储
网络图片链接格式:
http://www.example.com/picture.jpg
import requests
import os
url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1580895731055&di=8700ba330a284d045c1e9f3df8a622b6&imgtype=0&src=http%3A%2F%2Fpic.rmb.bdstatic.com%2Ff79ba62d4fdf35ceea4af90e31226ce1.jpeg"
root = "H://pics//" #定义根目录
path = root + url.split('/')[-1]#定义路径,根目录+文件名称(与url最后文件名称相同),split()分隔符
try:
if not os.path.exists(root): #os.path.exists()判断文件路径是否存在
os.mkdir(root) #如果不存在建立一个根目录,os.mkdir()创建目录
if not os.path.exists(path):
r = requests.get(url) #判断文件是否存在,如果不存在通过requests.get获取
with open(path, 'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
实例:IP地址归属地的自动查询
网络提供查询地址的库:
http://www.ip138.com/ip.asp?ip=ipaddress
import requests
url = "http://www.ip138.com/ip.asp?ip="
try:
r = requests.get(url + '202.204.80.112')
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")