荐 Python爬虫模块requests的常用函数方法总结
文章目录
前言
requests 库其实是基于 urllib 编写的,对 urllib 进行了封装,使得使用时候的体验好了很多,现在 urllib 已经出到了3版本,功能和性能自然是提升了不少。
所以,requests最新版本也是基于最新的 urllib3 进行封装。
关于怎么引入这个包不再赘述
基本用法
总述
方法 | 说明 |
---|---|
requests.request() | 构造一个请求 |
requests.get() | 该方法用于向目标网址发送请求,接收响应. |
requests.head() | 只请求页面的首部 |
requests.post() | 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 |
requests.put() | 从客户端向服务器传送的数据取代指定的文档的内容 |
requests.patch() | 向URL提交局部更新请求 |
requests.delete() | 请求服务器删除指定的页面 |
我们一个一个来说明
request方法
request方法用于构造一个请求,可以是get\post\put
等任意一种,参数列举如下:
- url:请求 URL
- params:请求参数,字典类型,常用于发送 GET 请求时使用
- timeout:超时时间 ,整数类型
- headers:设置请求头
- auth:指定登陆时的账号和密码,元祖类型
- verify:请求网站时是否需要验证,布尔类型
- proxies:设置代理
- cookies:cookies 值
- allow_redirects:布尔值,默认为Ture,重定向开关
- stream:布尔值,默认为True,为True时会先下载响应头,当Reponse调用content方法时才下载响应体
- cert:传入客户端的SSL证书,为字符串时应是 SSL 客户端证书文件的路径(.pem格式,文件路径包含密钥和证书),如果是元组,就应该是一个(‘cert’, ‘key’) 二元值对。
import requests
from requests.package import urllib3
// 在urllib3时代,官方强制验证https的安全证书,如果没有通过是不能通过请求的,虽然添加忽略验证的参数,但是依然会 给出醒目的 Warning
urllib3.disable_warnings()
r = requests.request('get','http://www.baidu.com')
get方法
get方法一般用于请求返回数据,参数名为params该方法返回一个 Response 对象,其常用的属性和方法列举如下:
- response.url:返回请求网站的 URL
- response.status_code:返回响应的状态码
- response.encoding:返回响应的编码方式
- response.cookies:返回响应的 Cookie 信息
- response.headers:返回响应头
- response.content:返回 bytes 类型的响应体
- response.text:返回 str 类型的响应体,相当于response.content.decode(‘utf-8’)
- response.json():返回 dict 类型的响应体,相当于 json.loads(response.text)
post方法
post 一般用于表单提交,参数名为data
import requests
url = ...
headers = ...
data ={
'username':'111111',
'password':'111111'
}
r =requests.post(url, headers = headers, data = data)
.........
其返回参数与上面get请求获取方式一致
我们甚至可以使用post上传文件
import requests
url = ...
headers = ...
files = {'file':open('1.txt','rb')}
r =requests.post(url, headers = headers, files = files)
.........
post请求的json参数,这与data=data是不同的,可能某一天你会遇到,至少我在日本趣天这个网站见到过一次
在post请求中,对传进来的json值,会做如下处理:
1、会使用json模块中的dumps方法转成json数据。
2、会增加消息头中的content_type为application/json
所以,json参数不需要提前使用json模块的方法转成json字符串。
请注意,这里有坑:如果在传参时,提前转换成json字符串:requests.request(“post”,url,json=json.dumps(a),headers=headers)
put/patch/delete方法(不常用)
put:当客户端向Web服务端指定URL发送一个替换的文档或者上传一个新文档的时候使用,都不常用
patch:一般就是向URL提交局部更新请求
delete:一般就是请求服务器删除指定的页面
不常用,有兴趣自己了解
高级操作
会话保持
首先说一下,为什么要进行会话保持的操作?
requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数
尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的时强制登陆,有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求。
更重要的是session保证了是同一个用户操作,有些网站反爬便是基于同一个用户策略
#模拟淘宝登陆
import requests
url='https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fai.taobao.com%2F%3Fpid%3Dmm_26632323_6762370_25910879'
headers={'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
formdata={'TPL_username':'fsdafdfasf','TPL_password':'fsadfasf'}
se=requests.session() #建立session会话
ss=se.post(url=url,headers=headers,data=formdata) #发送post请求
if ss.status_code==200: #判断登陆状态
print('登录成功')
else:
print('登录失败')
使用代理
以我曾经写的一个代码片段为例,为了方便我使用了random.choice()
方法,看完下面不难得出,我们在执行爬虫的时候可以去用一个函数封装获取有效代理IP地址的方法,当然这就要去各大代理网站找找免费IP了,不过说实话没几个能用,不如花钱实在
def getResponse(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36',
'Connection': 'keep-alive',
'Accept-language': 'zh-CN,zh;q=0.9',
'Accept-encoding': 'gzip, deflate, br',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Upgrade-insecure-requests': "1"
}
# 设置代理ip
porxy_list = [
{"http": "http://121.237.148.95:3000"}, {"http": "http://1.202.116.62:8118"},
{"http": "http://218.75.102.198:8000"},
{"http": "http://49.83.243.248:8118"}, {"http": "http://39.137.69.7:8080"},
{"http": "http://221.180.170.104:8080"},
{"http": "https://101.4.136.34:81"},
]
proxy = random.choice(porxy_list)
print(proxy)
response = requests.get(url, headers=headers, proxies=proxy,timeout=2)
if response.status_code == requests.codes.ok: # 响应状态码是200 或者Requests还附带了一个内置的状态码查询对象
return response.text
return None
异常处理(记住就行)
exceptions 是requests中负责处理异常的模块,常见的有:
-
Timeout:请求超时
-
ConnectionError:网络问题,例如 DNS 故障,拒绝连接等
-
TooManyRedirects:请求超过配置的最大重定向数