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

🐻注意 :
所有显式抛出的异常都继承自requests.exceptions.RequestException,使用时用try...catch包围

证书验证

verify是在请求网站时需要输入证书时使用,平时很少用,他是个布尔类型。

import requests
from requests.packages import urllib3

urllib3.disable_warnings()
rep = requests.get("https://www.baidu.com",verify=False)
print(rep.status_code)

解析cookies

可不能暴露自己cookie随便构造一个

# 来自我写过的脚本
cookies_dict = session.cookies.get_dict()
cokkies_str = ''
or i, j in enumerate(cookies_dict):
    temp = j + '=' + cookies_dict[j] + ';'
    cokkies_str += temp
    cook = cokkies_str

#将字典转为CookieJar:
cookiesJar = requests.utils.cookiejar_from_dict(self.cookies, cookiejar=None,overwrite=True)

#CookieJar转为字典
requests.utils.dict_from_cookiejar(cookiesJar)

请求报文中部分参数解析

常见字段1

Accept: text/htnl, application/xhtml+xml

application/xmlq=0.9,中/*;q=08 Accept字段主要用来表示浏览器能够支持的内容类型有哪些。 text/html表示HTML文档。 application/ xhtml+xm表示 XHTML文档。application/xml表示XMAL文档。 q代表权重系数,值介于0和1之间。 所以这一行字段信息表示浏览器可以支持 text/html,application/xml、等内容类型,支持的优先顺序从左到右依次排列

常见字段2

accept-encoding:gzip, deflate

accept-encoding字段主要用来表示浏览器支持的压缩编码有哪些。
gzip是压缩编码的一种。 deflate是一种无损数据压缩算法。 这一行字段信息表示浏览器可以支持gzp、 deflate等压缩编码

常见字段3

Accept- Language:zhCN,zh;q=0.8,en-US;q=0.5,cnq=0.3

Accept-language主要用来表示浏览器所支持的语言类型。 zh-CN表示简体中文语言。zh表示中文,CN表示简体
en-Us表示英语(美国)语言 en表示英语语言 所以之一行字段表示浏览器可以支持zh-CN、zh、en-US、cn等语言

常见字段4

以这个为例
Mozilla5.0( Windows NT61;WOw64;rv:47.0) Gecko20100101Firefox/47.0

user-agent字段主要表示用户代理,服务器可以通过该字段识别出客户端的浏览器类客户端的操作系统及版本号型、浏览器版本号主要以伪造该字段进行网页排版引擎等客户端信息。所以之前要模拟浏览器登录,主要以伪造该字段进行
Mozilla5.0表示浏览器名和版本号
Windows NT61;WOw64;rv:47.0 表示客户端操作系统对应信息
Gecko表示网页排版引擎对应信息
Firefox/47.0表示火狐浏览器

常见字段5

Connection:keep-alive

Connection表示客户端与服务器的连接类型,对应的字段值主要有两种 keep-alive表示持久性连接
close表示单方面关闭连接,让连接断开

常见字段6

Host: www.baidu.com

Host字段表示请求的服务器网址是什么,此时这一行字段表示请求的服务器网址是www.baidu.com

常见字段7

通常作为一种简单的反爬手段
Referer:www.baidu.com

Referer字段主要表示来源网址地址,比如我们从www.baidu.com网址中访问了该网址下的子页面https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=5&tn=98010089_dg&wd=request%20headers&oq=requests.session&rsv_pq=ebc47ecf00216ee8&rsv_t=e6c0YDrOj3LOqU6aJvYxEyOYqywNGDq4C7EZFgUuvnoCdyuNRLzHyG2435dldAU0gEw&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=15&rsv_sug1=14&rsv_sug7=100&rsv_sug2=0&rsv_btype=t&inputT=3392&rsv_sug4=3392
那么此时来源网址为www.baidu.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值