Python 的 cookies

1、post 的使用

import requests
#引入requests。
url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'
#把登录的网址赋值给url。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
#加请求头,前面有说过加请求头是为了模拟浏览器正常的访问,避免被反爬虫。
data = {
'log': 'spiderman',  #写入账户
'pwd': 'crawler334566',  #写入密码
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn',
'testcookie': '1'
}
#把有关登录的参数封装成字典,赋值给data。
login_in = requests.post(url,headers=headers,data=data)
#用requests.post发起请求,放入参数:请求登录的网址、请求头和登录参数,然后赋值给login_in。

2、cookies 的使用

import requests
#引入requests。
url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'
#把请求登录的网址赋值给url。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
#加请求头,前面有说过加请求头是为了模拟浏览器正常的访问,避免被反爬虫。
data = {
'log': 'spiderman',  #写入账户
'pwd': 'crawler334566',  #写入密码
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn',
'testcookie': '1'
}
#把有关登录的参数封装成字典,赋值给data。
login_in = requests.post(url,headers=headers,data=data)
#用requests.post发起请求,放入参数:请求登录的网址、请求头和登录参数,然后赋值给login_in。
cookies = login_in.cookies
#提取cookies的方法:调用requests对象(login_in)的cookies属性获得登录的cookies,并赋值给变量cookies。

url_1 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'
#我们想要评论的文章网址。
data_1 = {
'comment': input('请输入你想要发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '13',
'comment_parent': '0'
}
#把有关评论的参数封装成字典。
comment = requests.post(url_1,headers=headers,data=data_1,cookies=cookies)
#用requests.post发起发表评论的请求,放入参数:文章网址、headers、评论参数、cookies参数,赋值给comment。
#调用cookies的方法就是在post请求中传入cookies=cookies的参数。
print(comment.status_code)
#打印出comment的状态码,若状态码等于200,则证明我们评论成功。

3、session 的使用
requests库的session会话对象可以跨请求保持某些参数,比如使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数。尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的时强制登陆,有的是不登陆返回的数据就是假的或者说是不完整的数据,此时就需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求。

import requests
#引用requests。
session = requests.session()
#用requests.session()创建session对象,相当于创建了一个特定的会话,帮我们自动保持了cookies。
url = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
data = {
    'log':input('请输入账号:'), #用input函数填写账号和密码,这样代码更优雅,而不是直接把账号密码填上去。
    'pwd':input('请输入密码:'),
    'wp-submit':'登录',
    'redirect_to':'https://wordpress-edu-3autumn.localprod.oc.forchange.cn',
    'testcookie':'1'
}
session.post(url,headers=headers,data=data)
#在创建的session下用post发起登录请求,放入参数:请求登录的网址、请求头和登录参数。

url_1 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'
#把我们想要评论的文章网址赋值给url_1。
data_1 = {
'comment': input('请输入你想要发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '13',
'comment_parent': '0'
}
#把有关评论的参数封装成字典。
comment = session.post(url_1,headers=headers,data=data_1)
#在创建的session下用post发起评论请求,放入参数:文章网址,请求头和评论参数,并赋值给comment。
print(comment)
#打印comment

4、cookies能帮我们保存登录的状态,那我们就在第一次登录时把cookies存储下来,等下次登录再把存储的cookies读取出来,这样就不用重复输入账号密码了。

import requests
session = requests.session()
url = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
data = {
    'log':'spiderman',
    'pwd':'crawler334566',
    'wp-submit':'登录',
    'redirect_to':'https://wordpress-edu-3autumn.localprod.oc.forchange.cn',
    'testcookie':'1'
}
a = session.post(url,headers=headers,data=data)
#print(type(login_in))
print(type(session.cookies))
print(type(a.cookies))
#打印cookies的类型,session.cookies就是登录的cookies
print(session)
print(session.cookies)
#打印cookies

运行结果:

<class 'requests.cookies.RequestsCookieJar'>
<class 'requests.cookies.RequestsCookieJar'>
<requests.sessions.Session object at 0x7f92a47b9590>
<RequestsCookieJar[<Cookie 328dab9653f517ceea1f6dfce2255032=4d926cfce4107b1e11057bbad6a2eeef for wordpress-edu-3autumn.localprod.oc.forchange.cn/>, <Cookie wordpress_logged_in_dc180e44ec13b4c601eeef962104f0fe=spiderman%7C1594215015%7CbEgygromlxkEZYOJ3Ujp4d9n4ylzvRc7dEqW87Wwfxs%7Cd12d202f9f9b50cf28ed97c516a68c0bc12d6541e3a558cea6f1bd13a71ea3a1 for wordpress-edu-3autumn.localprod.oc.forchange.cn/>, <Cookie wordpress_test_cookie=WP+Cookie+check for wordpress-edu-3autumn.localprod.oc.forchange.cn/>, <Cookie wordpress_sec_dc180e44ec13b4c601eeef962104f0fe=spiderman%7C1594215015%7CbEgygromlxkEZYOJ3Ujp4d9n4ylzvRc7dEqW87Wwfxs%7C44b6d701434c353cbabab6c0f5b69f2e8258810d30d85798277734bbb361dcdb for wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-admin>, <Cookie wordpress_sec_dc180e44ec13b4c601eeef962104f0fe=spiderman%7C1594215015%7CbEgygromlxkEZYOJ3Ujp4d9n4ylzvRc7dEqW87Wwfxs%7C44b6d701434c353cbabab6c0f5b69f2e8258810d30d85798277734bbb361dcdb for wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-content/plugins>]>

RequestsCookieJar是cookies对象的类,cookies本身的内容有点像一个列表,里面又有点像字典的键与值,具体的值我们看不懂,也不需要弄懂。

那怎么把cookies存储下来?能不能用文件读写的方式,把cookies存储成txt文件?

txt文件存储的是字符串,刚刚打印出来的cookies并不是字符串。那有没有能把cookies转成字符串的方法?

我们知道,json模块能把字典转成字符串。我们或许可以先把cookies转成字典,然后再通过json模块转成字符串。这样,就能用open函数把cookies存储成txt文件。

Python request增加cookie python post cookies_json


1、cookies -->字典 -->字符串

import requests,json
#引入requests和json模块。
session = requests.session()   
url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
data = {
'log': 'spiderman',
'pwd': 'crawler334566',
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn',
'testcookie': '1'
}
session.post(url, headers=headers, data=data)
print(session.cookies)
print('-----------------------------------------------------------------')
cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
#把cookies转化成字典。
print(cookies_dict)
#打印cookies_dict
print('-----------------------------------------------------------------')
cookies_str = json.dumps(cookies_dict)
#调用json模块的dumps函数,把cookies从字典再转成字符串。
print(cookies_str)
#打印cookies_str
f = open('cookies.txt', 'w')
#创建名为cookies.txt的文件,以写入模式写入内容。
f.write(cookies_str)
#把已经转成字符串的cookies写入文件。
f.close()
#关闭文件。

运行结果:

<RequestsCookieJar[
<Cookie 328dab9653f517ceea1f6dfce2255032=4d926cfce4107b1e11057bbad6a2eeef for wordpress-edu-3autumn.localprod.oc.forchange.cn/>, 
<Cookie wordpress_logged_in_dc180e44ec13b4c601eeef962104f0fe=spiderman%7C1594218513%7CRcRuXmuEjkFkd8PxohxmSxDKn5NRO17TE2t3rJYr2QE%7C260f42efad12dddfdad2e1606773f42e1c3a0d0d3f03bbe433b813a7fb45aeb4 for wordpress-edu-3autumn.localprod.oc.forchange.cn/>, 
<Cookie wordpress_test_cookie=WP+Cookie+check for wordpress-edu-3autumn.localprod.oc.forchange.cn/>, 
<Cookie wordpress_sec_dc180e44ec13b4c601eeef962104f0fe=spiderman%7C1594218513%7CRcRuXmuEjkFkd8PxohxmSxDKn5NRO17TE2t3rJYr2QE%7Cc027a5a5678b61156888f66eabb393a957a3f67ae9ca3a03b6bd8a74b2c549aa for wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-admin>, 
<Cookie wordpress_sec_dc180e44ec13b4c601eeef962104f0fe=spiderman%7C1594218513%7CRcRuXmuEjkFkd8PxohxmSxDKn5NRO17TE2t3rJYr2QE%7Cc027a5a5678b61156888f66eabb393a957a3f67ae9ca3a03b6bd8a74b2c549aa for wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-content/plugins>
]>
-----------------------------------------------------------------
{'328dab9653f517ceea1f6dfce2255032': '4d926cfce4107b1e11057bbad6a2eeef', 
'wordpress_logged_in_dc180e44ec13b4c601eeef962104f0fe': 'spiderman%7C1594218513%7CRcRuXmuEjkFkd8PxohxmSxDKn5NRO17TE2t3rJYr2QE%7C260f42efad12dddfdad2e1606773f42e1c3a0d0d3f03bbe433b813a7fb45aeb4', 
'wordpress_test_cookie': 'WP+Cookie+check', 
'wordpress_sec_dc180e44ec13b4c601eeef962104f0fe': 'spiderman%7C1594218513%7CRcRuXmuEjkFkd8PxohxmSxDKn5NRO17TE2t3rJYr2QE%7Cc027a5a5678b61156888f66eabb393a957a3f67ae9ca3a03b6bd8a74b2c549aa'}
-----------------------------------------------------------------
{"328dab9653f517ceea1f6dfce2255032": "4d926cfce4107b1e11057bbad6a2eeef", "wordpress_logged_in_dc180e44ec13b4c601eeef962104f0fe": "spiderman%7C1594218513%7CRcRuXmuEjkFkd8PxohxmSxDKn5NRO17TE2t3rJYr2QE%7C260f42efad12dddfdad2e1606773f42e1c3a0d0d3f03bbe433b813a7fb45aeb4", "wordpress_test_cookie": "WP+Cookie+check", "wordpress_sec_dc180e44ec13b4c601eeef962104f0fe": "spiderman%7C1594218513%7CRcRuXmuEjkFkd8PxohxmSxDKn5NRO17TE2t3rJYr2QE%7Cc027a5a5678b61156888f66eabb393a957a3f67ae9ca3a03b6bd8a74b2c549aa"}

2、字符串 -->字典 -->cookies

cookies_txt = open('cookies.txt', 'r')
#以reader读取模式,打开名为cookies.txt的文件。
cookies_dict = json.loads(cookies_txt.read())
#调用json模块的loads函数,把字符串转成字典。
cookies = requests.utils.cookiejar_from_dict(cookies_dict)
#把转成字典的cookies再转成cookies本来的格式。
session.cookies = cookies
#获取cookies:就是调用requests对象(session)的cookies属性。

最终完整程序:

import requests, json
session = requests.session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

def cookies_read():
    cookies_txt = open('cookies.txt', 'r')
    cookies_dict = json.loads(cookies_txt.read())
    cookies = requests.utils.cookiejar_from_dict(cookies_dict)
    return (cookies)
    # 以上4行代码,是cookies读取。

def sign_in():
    url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'
    data = {'log':'spiderman', #用input函数填写账号和密码,这样代码更优雅,而不是直接把账号密码填上去。
    		'pwd':'crawler334566',
            'wp-submit': '登录',
            'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn',
            'testcookie': '1'}
    session.post(url, headers=headers, data=data)
    cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
    cookies_str = json.dumps(cookies_dict)
    f = open('cookies.txt', 'w')
    f.write(cookies_str)
    f.close()
    # 以上5行代码,是cookies存储。


def write_message():
    url_2 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'
    data_2 = {
        'comment': '请输入你要发表的评论:'#input('请输入你要发表的评论:'),
        'submit': '发表评论',
        'comment_post_ID': '13',
        'comment_parent': '0'
    }
    return (session.post(url_2, headers=headers, data=data_2))
    #以上9行代码,是发表评论。


try:
    session.cookies = cookies_read()
except FileNotFoundError:
    sign_in()

num = write_message()
if num.status_code == 200:
    print('成功啦!')
else:
    sign_in()
    num = write_message()