欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 Python爬虫模块requests的常用函数方法总结

程序员文章站 2022-03-03 11:57:24
文章目录前言基本用法总述request方法get方法post方法put/patch/delete方法(不常用)高级操作会话保持异常处理(记住就行)证书验证解析cookies请求报文中部分参数解析常见字段1常见字段2常见字段3常见字段4常见字段5常见字段6常见字段7前言requests 库其实是基于 urllib 编写的,对 urllib 进行了封装,使得使用时候的体验好了很多,现在 urllib 已经出到了3版本,功能和性能自然是提升了不少。所以,requests最新版本也是基于最新的 urllib3...

前言

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:请求超过配置的最大重定向数