吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1409|回复: 9
收起左侧

[求助] 这个字典转换的原理是什么我不是科班出身还请详细说明

[复制链接]
一只凉不了 发表于 2020-7-8 23:24
cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

theSeven 发表于 2020-7-8 23:46
方式二与方式一都是通过携带Cookie来发请求,方式二直接调用requests的cookies参数,但是要求cookies是一个字典类型,所以要对从网上复制下来的cookie值进行一些处理,cookie中都是键值对的形式,如:

uuid_tt_dd=10_19035893370-1578805336439-452978; dc_session_id=10_1578805336439.387381;

我们要将这样的一串字符串做成字典的形式首先要将它以“; ”分隔,注意两个值直接不仅有;符号,还有一个空格,所以是;+空格。分隔之后得到的格式为:键=值 ,再以=号分隔,取[0]为键,[1]为值,如下:

import requests

cookies="从网上复制的cookie值"

cookies_dict={}

for i in cookies.split("; "):

   cookies_dict[i.splict('=')[0]] = i.splict('=')[1]

html=requests.get(url='',cookies=cookies_dict}
参考链接:https://blog.csdn.net/ck784101777/java/article/details/104407925
头像被屏蔽
deng00200 发表于 2020-7-9 06:21
rosemaryzed 发表于 2020-7-9 08:46
楼上说的总结一下可以是
cookies_dict = {取[0]为键:取[1]为值}
AsktaoMS 发表于 2020-7-9 09:25
本帖最后由 AsktaoMS 于 2020-7-9 10:11 编辑

cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}
是一个推导式。可以分步骤来看。

1、cookie:他的是字符串格式,例如:"a=2;b=3;c=4;"

2、str.split方法:是以提供的字符串为切割点,切割这个字符串的。返回是列表格式。
2.1、cookies_str.split('; ')中,cookies_str.split(';'),就是以“;”为切割点,切割cookies字符串。结果是:[a=2,b=3,c=4]
2.2 、for cookie in cookies_str.split('; ')中的cookies,每次运行的值就是“a=2”、"b=3"、"c=4"
2.3、同理cookie.split("="),他的结果就是[a,2]、[b,3]、[c,4]

3、切片:cookie.split('=')[0]:cookie.split('=')[-1]
3.1、列表[0]是获取该列表的第一位,列表[-1]是活的该列表的最后一位。
3.2、cookie.split('=') 的结果是:[a,2],那么cookie.split('=')[0]就是“a”、cookie.split('=')[-1]就是2

4、推导式  cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}
4.1、推导式的结构,在字典{}、或者列表[]中,关键字for之前的表达式的规则。for循环是数据来源。他们两个的关联就是每次获取的item,也就是该推导式的“cookie”
4.2、按文字理解,for循环每次得到的cookie后,再在表达式中进行二次数据加工后,生成指定结构数据。
4.3、在该推导式的规则是,cookie.split('=')[0]:cookie.split('=')[-1] ,注意标红的分号“:”,它每次生成的结果是:a:2、b:3、c:4。
4.3、最终cookies_dict的结果是就是整个for循环结束后所有cookie按照表达式:{a:2,b:3,c:4}

5、拓展:
5.1、还有列表推导式,同理:例如:[ x+1 for x in range(3)],是否有感觉,想一想能说出运行结果了
5.2、和之前不同的是外边框用的是中括号[] 、中括号代表是列表。所以要按照列表的格式去生成,否则会报错。

他同等于:
[Python] 纯文本查看 复制代码
cookies_str = "a=2;b=3;c=4;"          # 原始cookies数据
cookies_dict = {}                              # 空字典,用于存放结果
for cookie in cookies_str.split('; '):    # 获取cookie
    cookie_temp = {cookie.split('=')[0]:cookie.split('=')[-1]}    # 规定表达式规则
    cookies_dict.update(cookie_temp )                # 将数据添加至字典 cookies_dict 
print(cookies_dict )



上面的代码最少是三行。
如果你会了推导式,只需要一行代码就能实现,并且不优雅吗?

很多东西只是不知道、不理解。
只要知道了、理解了,就不难了。
要想熟练掌握,就要多练习,加油!
知心 发表于 2020-7-9 09:50
本帖最后由 知心 于 2020-7-9 10:36 编辑

示例代码:
[Python] 纯文本查看 复制代码
cookies_str="PHPSESSID=r9r8cgomqe61q3ndu6e0; GUIDE_MAP:=1594190653;Hm_lvt_83efb6da7f0d183ee8ad0d78f0=1594115801,1594170658,1594189409,1594190655; acw_tc=2760825615941934039125236e771ed80ecc64edf96b346e78c; Hm_lpvt_83efb6da7f0d18d3ee8ad0d78f0=1594194025"

cookies_dict={}
for cookie in cookies_str.split('; '):
    cookies_dict[cookie.split('=')[0]]=cookie.split('=')[-1]
print(cookies_dict)


执行结果:
[Shell] 纯文本查看 复制代码
{'PHPSESSID': 'r9r8cgomqe61q3ndu6e0', 'GUIDE_MAP:': '1594115801,1594170658,1594189409,1594190655', 'acw_tc': '2760825615941934039125236e771ed80ecc64edf96b346e78c', 'Hm_lpvt_83efb6da7f0d18d3ee8ad0d78f0': '1594194025'}


分析:
    1.我们首先拿到的是str类型的一串cookie,我们最终需要的是dict类型的cookie。我们要做的就是转换
    2.通过分析我们可以知道,一个cookie包含多个字段,每个字段之间通过<;和空格>组合进行分割
    3.每个字段包含键和值两部分,他们通过<=>进行分割
    4.最后我们通过字符串的split函数把字符串处理成希望的dict

    由于遍历以后需要对数据的处理可以一步完成,所以我们可以简写为:
   
[Python] 纯文本查看 复制代码
cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split(';')}
AsktaoMS 发表于 2020-7-9 10:12
知心 发表于 2020-7-9 09:50
示例代码:
[mw_shl_code=python,true]cookies_str="PHPSESSID=r9r8cgomqe61q3ndu6e0; GUIDE_MAP:=15941906 ...

他的运行结果应该是一个字典,你打印了4个。要在for循环外,定义一个空字典接收结果吧?
知心 发表于 2020-7-9 10:25
AsktaoMS 发表于 2020-7-9 10:12
他的运行结果应该是一个字典,你打印了4个。要在for循环外,定义一个空字典接收结果吧?

想要一个需要对获取的字典做一个合并,我在for里边打印的
 楼主| 一只凉不了 发表于 2020-7-11 11:37
theSeven 发表于 2020-7-8 23:46
方式二与方式一都是通过携带Cookie来发请求,方式二直接调用requests的cookies参数,但是要求cookies是一个 ...

谢谢大哥
懂了
 楼主| 一只凉不了 发表于 2020-7-11 12:54
AsktaoMS 发表于 2020-7-9 09:25
cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}
...

谢谢详解  我懂了  
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 04:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表