美文网首页
我的小饼干--cookies

我的小饼干--cookies

作者: javen_spring | 来源:发表于2020-05-12 16:16 被阅读0次

    cookies:浏览器记录了在网站上进行登录的账号及密码等信息并保存在本地。比如当你登录一个网站,你都会在登录页面看到一个可勾选的选项“记住我”,如果你勾选了,以后你再打开这个网站就会自动登录,这就是cookie在起作用。但cookies也是有时效性的,过期后就会失效。

    1 浏览器准备

    • “检查”工具打开,【preserve log】勾选,展开第0个请求【wp-login.php】,浏览一下【headers】。在【General】键里,我们可以先只看前两个参数【Request URL】(请求网址)和【Request Method】(请求方式)。
    登录界面.png

    2 登录

    登录后界面.png
    • 可见网页请求方式是post。post和get都可以带着参数请求,不过get请求的参数会在url上显示出来。post请求的参数就不会直接显示,而是隐藏起来。像账号密码这种私密的信息,就应该用post的请求。
    • get请求会应用于获取网页数据,比如我们之前学的requests.get()。post请求则应用于向网页提交数据,比如提交表单类型数据(像账号密码就是网页表单的数据)。

    3 requests headers与response headers

    requests headers与response headers.png
    • 正如requests headers存储的是浏览器的请求信息,response headers存储的是服务器的响应信息。cookies就在其中。response headers里有set cookies的参数。set cookies就是服务器往浏览器写入了cookies。
    • 继续看headers内容,下拉可见form data的条目。有5个参数,log和pwd显然是我们的账号和密码,wp-submit猜一下就知道是登录的按钮,redirect_to后面带的链接是我们登录后会跳转到的这个页面网址,testcookie我们不知道是什么。
    form data.png

    4 带保存好的账号及密码登录

    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。
    print(login_in)
    #打印login_in
    
    • Response [200],是返回了200的状态码,意味着服务器接收到并响应了登录请求。

    5 登录后发表评论

    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,则证明我们评论成功。
    
    • 最后之所以加一行打印状态码的代码,是想运行整个代码后,能立马判断出评论到底有没有成功发表。只要状态码等于200,就说明服务器成功接收并响应了我们的评论请求.
    • 登录的cookies其实包含了很多名称和值,真正能帮助我们发表评论的cookies,只是取了登录cookies中某一小段值而已。所以登录的cookies和评论成功后,你在【wp-comments-post.php】里的headers面板中看到的cookies是不一致的。

    6 session会话

    • session和cookies的关系密切:cookies中存储着session的编码信息,session中又存储了cookies的信息。
    • 使用session来优化代码:
    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
    

    7 使用json模块将cookies的 RequestsCookieJar对象转换为字符串保存为txt文件

    转换.png
    • RequestsCookieJar是cookies对象的类,cookies本身的内容有点像一个列表,里面又有点像字典的键与值
    转换方法.png
    • cookies保存为txt文件的代码:
    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': input('请输入你的账号:'),
    'pwd': input('请输入你的密码:'),
    '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转化成字典。
    print(cookies_dict)
    #打印cookies_dict
    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()
    #关闭文件。
    

    8 读取txt文件的cookies:借助json模块

    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属性。
    

    9 把代码优化成:如果程序能读取到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'
    }
    #添加请求头,避免被反爬虫。
    try:
    #如果能读取到cookies文件,执行以下代码,跳过except的代码,不用登录就能发表评论。
        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属性。
    
    except FileNotFoundError:
    #如果读取不到cookies文件,程序报“FileNotFoundError”(找不到文件)的错,则执行以下代码,重新登录获取cookies,再评论。
    
        url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'
        #登录的网址。
        data = {'log': input('请输入你的账号:'),
                'pwd': input('请输入你的密码:'),
                'wp-submit': '登录',
                'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn',
                'testcookie': '1'}
        #登录的参数。
        session.post(url, headers=headers, data=data)
        #在会话下,用post发起登录请求。
    
        cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
        #把cookies转化成字典。
        cookies_str = json.dumps(cookies_dict)
        #调用json模块的dump函数,把cookies从字典再转成字符串。
        f = open('cookies.txt', 'w')
        #创建名为cookies.txt的文件,以写入模式写入内容
        f.write(cookies_str)
        #把已经转成字符串的cookies写入文件
        f.close()
        #关闭文件
    
    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 = session.post(url_1,headers=headers,data=data_1)
    #在创建的session下用post发起评论请求,放入参数:文章网址,请求头和评论参数,并赋值给comment。
    print(comment.status_code)
    #打印comment的状态码
    

    10 面向对象编程代码

    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': input('请输入你的账号'),
                'pwd': input('请输入你的密码'),
                '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()
    
    后记:
    • 感觉这个知识点有点难,要反复消化
    • 本篇文章来自于风变课程笔记。

    相关文章

      网友评论

          本文标题:我的小饼干--cookies

          本文链接:https://www.haomeiwen.com/subject/gbbbnhtx.html