打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python爬虫requests库教程(三)
userphoto

2023.07.05 广西

关注

2.4.5 cookieJar 对象转换为 cookies 字典的方法

使用 requests 获取的 resposne 对象,具有 cookies 属性。该属性值是一个 cookieJar 类型,包含了对方服务器设置在本地的 cookie 。我们如何将其转换为 cookies 字典呢?

❖ 1. 转换方法

cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)

❖ 2. 其中 response.cookies 返回的就是 cookieJar 类型的对象

❖ 3. requests.utils.dict_from_cookiejar 函数返回 cookies 字典

import requests
import re
url = 'https://www.zhihu.com/creator'
cookies_str = '复制的cookies'
headers = {'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
cookie_dict = {cookie.split('=', 1)[0]:cookie.split('=', 1)[-1] for cookie in
cookies_str.split('; ')}
# 请求头参数字典中携带cookie字符串
resp = requests.get(url, headers=headers, cookies=cookies_dict)
data = re.findall('CreatorHomeAnalyticsDataItem-title.*?>(.*?)</div>',resp.text)
print(resp.status_code)
print(data)
# 可以把一个字典转化为一个requests.cookies.RequestsCookieJar对象
cookiejar = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None,
overwrite=True)
type(cookiejar) # requests.cookies.RequestsCookieJar
type(resp.cookies) # requests.cookies.RequestsCookieJar
#构造RequestsCookieJar对象进行cookies设置其中jar的类型也是 requests.cookies.
RequestsCookieJar
#cookiejar转字典
requests.utils.dict_from_cookiejar(cookiejar)


2.5 Timeout 设置

在平时网上冲浪的过程中,我们经常会遇到网络波动,这个时候,一个请求等了很久可能任 然没有结果。信搜索公众号:架构师指南,回复:架构师 领取资料 。

在爬虫中,一个请求很久没有结果,就会让整个项目的效率变得非常低,这个时候我们就需 要对请求进行强制要求,让他必须在特定的时间内返回结果,否则就报错。

❖ 1. 超时参数 timeout 的使用方法

response = requests.get(url, timeout=3)

❖ 2. timeout=3 表示:发送请求后, 3 秒钟内返回响应,否则就抛出异常

url = 'http://www.tipdm.com/tipdm/index.html'

#设置超时时间为2

print('超时时间为2:',requests.get(url,timeout=2))

超时时间过短将会报错

requests.get(url,timeout = 0.1) #备注时间为0.001

超时时间为 2: <Response [200]>

 3.使用Request发送POST请求

思考:哪些地方我们会用到POST请求?

1.登录注册(在 web 工程师看来 POST 比 GET 更安全, url 地址中不会暴露用户的账号密码等信息)

2.需要传输大文本内容的时候( POST 请求对数据长度没有要求)

所以同样的,我们的爬虫也需要在这两个地方回去模拟浏览器发送 post 请求其实发送 POST 请求与 GET 方式很相似,只是参数的传递我们需要定义在 data 中即可:

POST参数说明:

post(url, data=None, json=None, **kwargs):

❖ URL: 待请求的网址

❖ data :( 可选 ) 字典,元组列表,字节或类似文件的对象,以在 Request 的正文中发送

❖ json: ( 可选 )JSON 数据,发送到 Request 类的主体中。

❖ **kwargs: 可变长关键字参数

import requests
payload = {’key1’: ’value1’, ’key2’: ’value2’}
req = requests.post('http://httpbin.org/post', data=payload)
print(req.text)


3.1 POST发送JSON数据

很多时候你想要发送的数据并非编码为表单形式的 , 发现特别在爬取很多java网址中出现这个问题。如果你传递一个 string而不是一个dict ,那么数据会被直接发布出去。我们可以使用json.dumps()是将 dict 转化成str格式 ; 此处除了可以自行对dict进行编码,你还可以使用json参数直接传递,然后它就会被自动编码。

import json
import requests
url = ’http://httpbin.org/post’
payload = {’some’: ’data’}
req1 = requests.post(url, data=json.dumps(payload))
req2 = requests.post(url, json=payload)
print(req1.text)
print(req2.text)

可以发现,我们成功获得了返回结果,其中 form 部分就是提交的数据,这就证明 POST 请求 成功发送了。

笔记

requests 模块发送请求有 data 、 json 、 params 三种携带参数的方法。

params 在 get 请求中使用, data 、 json 在 post 请求中使用。

data 可以接收的参数为:字典,字符串,字节,文件对象。

❖ 使用 json 参数,不管报文是 str 类型,还是 dict 类型,如果不指定 headers 中 content-type 的

类型,默认是:application/json 。

❖ 使用 data 参数,报文是 dict 类型,如果不指定 headers 中 content-type 的类型,默认 application/x

www-form-urlencoded ,相当于普通 form 表单提交的形式,会将表单内的数据转换成键值对,此时数据可以从 request.POST 里面获取,而 request.body 的内容则为 a=1&b=2 的这种键值对形式。

❖ 使用 data 参数,报文是 str 类型,如果不指定 headers 中 content-type 的类型,默认 application/json。

用 data 参数提交数据时, request.body 的内容则为 a=1&b=2 的这种形式,

用 json 参数提交数据时, request.body 的内容则为 ’'a': 1, 'b': 2’ 的这种形式

3.2 POST 上传文件

如果我们要使用爬虫上传文件,可以使用 fifile 参数:

url = 'http://httpbin.org/post'
files = {'file': open('test.xlsx''rb')}
req = requests.post(url, files=files)
req.text

如果有熟悉 WEB 开发的伙伴应该知道,如果你发送一个非常大的文件作为 multipart/form data 请求,你可能希望将请求做成数据流。默认下 requests 不支持 , 你可以使用 requests-toolbelt 三方库。

3.3 使用 POST 请求抓取网页

主要是找到待解析的网页

import requests
# 准备翻译的数据
kw =
input('请输入要翻译的词语:')
ps = {'kw': kw}
# 准备伪造请求
headers = {
# User-Agent:首字母大写,表示请求的身份信息;一般直接使用浏览器的身份信息,伪造
爬虫请求
# 让浏览器认为这个请求是由浏览器发起的[隐藏爬虫的信息]
'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.41'

}
# 发送POST请求,附带要翻译的表单数据--以字典的方式进行传递
response = requests.post('https://fanyi.baidu.com/sug', data=ps)
# 打印返回的数据
# print(response.content)
print(response.content.decode('unicode_escape'))
 4.Requests进阶(1)*Session会话维持

在这一部分主要介绍关于 Session 会话维持,以及代理 IP 的使用。

在requests中,如果直接利用get()或post()等方法的确可以做到模拟网页的请求,但是这实际上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面。

设想这样一个场景,第一个请求利用post() 方法登录了某个网站,第二次想获取成功登录后的自己的个人信息, 你又用了一次get()方法去请求个人信息页面。实际上,这相当于打开了两个浏览器,这是两个完全不相关的会话,能成功获取个人信息吗?那当然不能。

有小伙伴可能说了,我在两次请求时设置一样的cookies不就行了?可以,但这样做起来显 得很烦琐,我们有更简单的解决方法。

其实解决这个问题的主要方法就是维持同一个会话,也就是相当于打开一个新的浏览器选项 卡而不是新开一个浏览器。但是我又不想每次设置cookies,那该怎么办呢?这时候就有了新的 利器一Session对象。

利用它,我们可以方便地维护一个会话,而且不用担心 cookies 的问题,它 会帮我们自动处理好。

requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。接下来我们就来学习它。

4.1 requests.session 的作用以及应用场景

❖ requests.session 的作用

自动处理 cookie , 即下一次请求会带上前一次的 cookie

❖ requests.session 的应用场景

自动处理连续的多次请求过程中产生的cookie

4.2 requests.session 使用方法

session 实例在请求了一个网站后,对方服务器设置在本地的 cookie 会保存在 session 中,下 一次再使用 session 请求对方服务器的时候,会带上前一次的 cookie。

session = requests . session () # 实 例 化 session 对 象

response = session . get ( url , headers , ...)

response = session . post ( url , data , ...)

session 对象发送 get 或 post 请求的参数,与 requests 模块发送请求的参数完全一致。


4.3 使用Session维持github登录信息

❖ 对 github 登陆以及访问登陆后才能访问的页面的整个完成过程进行抓包

❖ 确定登陆请求的 url 地址、请求方法和所需的请求参数

-部分请求参数在别的 url 对应的响应内容中,可以使用 re 模块获取

❖ 确定登陆后才能访问的页面的的 url 地址和请求方法

❖ 利用 requests.session 完成代码

import requests
import re
# 构造请求头字典
headers = {
'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
,}
# 实例化session对象
session = requests.session()
# 访问登陆页获取登陆请求所需参数
response = session.get(https://github.com/login, headers=headers)
authenticity_token = re.search('name='authenticity_token' value='(.*?)' />',
response.text).group(1) # 使用正则获取登陆请求所需参数
# 构造登陆请求参数字典
data = {
'commit''Sign in'# 固定值
'utf8'' '# 固定值
'authenticity_token': authenticity_token, # 该参数在登陆页的响应内容中
'login':
input('输入github账号:'),
'password':
input('输入github账号:')}
# 发送登陆请求(无需关注本次请求的响应)
session.post(https://github.com/session, headers=headers, data=data)
# 打印需要登陆后才能访问的页面
response = session.get(https://github.com/settings/profile, headers=headers)
print(response.text)

可以使用文本对比工具进行校对 !

人生苦短,我用python

神秘礼包获取方式

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
接口自动化测试之-requests模块详解
Python requests库用法实例详解
爬虫入门教程 —— 2
requests第三方库
Python爬虫必备技术点(一)
每天一个python模块之Requests
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服