一只凉不了 发表于 2020-7-8 23:24

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

cookies_dict = {cookie.split('='):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;

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

import requests

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

cookies_dict={}

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

   cookies_dict] = i.splict('=')

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 = {取为键:取为值}

AsktaoMS 发表于 2020-7-9 09:25

本帖最后由 AsktaoMS 于 2020-7-9 10:11 编辑

cookies_dict = {cookie.split('='):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字符串。结果是:
2.2 、for cookie in cookies_str.split('; ')中的cookies,每次运行的值就是“a=2”、"b=3"、"c=4"
2.3、同理cookie.split("="),他的结果就是、、

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

4、推导式cookie.split('='):cookie.split('=')[-1] for cookie in cookies_str.split('; ')}
4.1、推导式的结构,在字典{}、或者列表[]中,关键字for之前的表达式的规则。for循环是数据来源。他们两个的关联就是每次获取的item,也就是该推导式的“cookie”
4.2、按文字理解,for循环每次得到的cookie后,再在表达式中进行二次数据加工后,生成指定结构数据。
4.3、在该推导式的规则是,cookie.split('='):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、和之前不同的是外边框用的是中括号[] 、中括号代表是列表。所以要按照列表的格式去生成,否则会报错。

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


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

很多东西只是不知道、不理解。
只要知道了、理解了,就不难了。
要想熟练掌握,就要多练习,加油!{:1_893:}

知心 发表于 2020-7-9 09:50

本帖最后由 知心 于 2020-7-9 10:36 编辑

示例代码:
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('=')[-1]
print(cookies_dict)

执行结果:
{'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

    由于遍历以后需要对数据的处理可以一步完成,所以我们可以简写为:
    cookies_dict = {cookie.split('='):cookie.split('=')[-1] for cookie in cookies_str.split(';')}

AsktaoMS 发表于 2020-7-9 10:12

知心 发表于 2020-7-9 09:50
示例代码:
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('='):cookie.split('=')[-1] for cookie in cookies_str.split('; ')}
...

谢谢详解我懂了{:1_893:}
页: [1]
查看完整版本: 这个字典转换的原理是什么我不是科班出身还请详细说明