zoukankan      html  css  js  c++  java
  • 爬虫模拟cookie自动登录(人人网自动登录)

    什么是cookie?

    在网站中,HTTP请求时无状态的,也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是谁,cookie的出现就是为了解决这个问题,第一次登陆后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同浏览器有不同的存储大小,但一般不超过4KB,因此使用cookie只能存储一些小量的数据

    cookie 的格式:

    Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

    参数意义:

    NAME:cookie的名字

    VALUE:cookie的值

    Expires:cookie的过期时间

    Path:cookie的作用路径

    Domain:cookie作用的域名

    SECURE:是否只在https协议下起作用

    使用cookielib库和HTTPCookieProcessor模拟登陆

    cookie是指网站服务器为了辨别用户身份和进行session跟踪,而存储在用户浏览器上的文本文件,cookie可以保持登陆信息到用户下次与服务器的会话,这里以人人网为例,人人网中, 要访问个人的主页,必须先登录才能访问,登陆说白了就是要有cookie信息,那么如果我们想要用代码的方式访问,就必须要有正确的cookie信息才能访问,解决方案有两种,第一种是使用浏览器访问,然后将cookie信息赋值下来,放到headers中,示例代码如下:

    # 使用cookie登录人人网
    from urllib import request
    
    # 人人网登陆 url : http://www.renren.com/
    # 大鹏董成鹏 url : http://www.renren.com/880151247/profile
    
    # 不设置cookie信息
    
    # dapeng_url = 'http://www.renren.com/880151247/profile'
    # header = {
    #     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) '
    #                   'Chrome/75.0.3770.100 Safari/537.36',
    # }
    # req = request.Request(dapeng_url, headers=header)
    # res = request.urlopen(req)
    # # res.read() 出来是一个bytes类型的数据,bytes-decode-str, str-encode-byte
    # print(res.read().decode('utf-8'))
    # with open('/Users/mac/PycharmProjects/TEST/TEST/爬虫day/file/renren.html', 'w') as f:
    #     f.write(res.read().decode('utf-8'))
    
    
    # # 设置cookie信息
    # dapeng_url = 'http://www.renren.com/880151247/profile'
    # header = {
    #     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) '
    #                   'Chrome/75.0.3770.100 Safari/537.36',
    #     'Cookie': 'anonymid=jxcml3nv-wfdivp; depovince=GW; _r01_=1; JSESSIONID=abcXhnCqsGEKg7eTLOrUw; '
    #               'ick_login=dfc44a24-a4fd-45d9-be69-6aabe3a786c8; _'
    #               'de=89E5EC670B337DC16D5D4E9A6EE4D047; first_login_flag=1; ln_uact=15666809216; '
    #               'ln_hurl=http://hdn.xnimg.cn/photos/hdn121/20130503/2205/h_main_pQ5D_d0a700000241111a.jpg; id=447270940; '
    #               'jebecookies=07393439-a951-4642-ad39-a68eaac5558a|||||; '
    #               'p=0bd1602e02b8a9766402dd5917df60070; '
    #               't=5d0757048b69b35c0bd06fbf6c8aa7d10; societyguester=5d0757048b69b35c0bd06fbf6c8aa7d10; xnsid=6e55b64f; '
    #               'ver=7.0; loginfrom=null; '
    #               'jebe_key=5942f4fe-f07c-450a-a9c0-9ef5ce16e6db%7C619532812667f7915f71d620643dd5ba%7C1561516986287%7C1%7C1561516986309; '
    #               'jebe_key=5942f4fe-f07c-450a-a9c0-9ef5ce16e6db%7C619532812667f7915f71d620643dd5ba%7C1561516986287%7C1%7C1561516986313; '
    #               'wp=1; wp_fold=1'
    # }
    # req = request.Request(dapeng_url, headers=header)
    # res = request.urlopen(req)
    # # res.read() 出来是一个bytes类型的数据,bytes-decode-str, str-encode-byte
    # print(res.read().decode('utf-8'))
    # with open('/Users/mac/PycharmProjects/TEST/TEST/爬虫day/file/renren2.html', 'w') as f:
    #     f.write(res.read().decode('utf-8'))
    
    # cookie模拟自动登录
    
    """
    http cookiejar 模块
    该模块主要的类有cookiejar,FileCookieJar, MozillaCookieJar,LWPCookieJar 这四个类的作用分别如下:
    1,CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie,向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对cookiejar
    实例进行垃圾回收后cookie也将丢失
    2,FileCookieJar(filename, delayload=None,policy=None);从FileCookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将
    Cookie存储到文件中,filename是存储cookie的文件名,delayload为True时支持延迟访问文件,即只有在需要时才读取文件或在文件中存储数据。
    3,MozillaCookieJar(filename, delayload=None,policy=None),从FileCookieJar派生而来,创建于Mozilla浏览器cookies.txt兼容的
    FileCookieJar实例
    4,LWPCookieJar(filename, delayload=None,policy=None)),从FileCookieJar派生而来,创建与libwww.per标准的Set_Cookie3文件格式兼容的
    FileCookieJar实例
    利用http.cookiejar 和 request.HTTPCookierProcessor登录人人网,相关代码如下:
    """
    
    from http.cookiejar import CookieJar
    from urllib.parse import urlencode
    
    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/75.0.3770.100 Safari/537.36',
    
    }
    
    
    # 第一步登录
    """
    1.1 创建一个cookiejar对象
    1.2,使用cookiejar创建一个HTTPCookieProcessor对象
    1.3,使用上一步创建的handler创建一个opener
    1.4, 使用opener发送登录的请求(人人网的邮箱和密码)
    """
    
    cookieJar = CookieJar()
    handler = request.HTTPCookieProcessor(cookieJar)
    opener = request.build_opener(handler)
    url = 'http://www.renren.com/PLogin.do'
    data = {
        'email': '15666809216',
        'password': 'beauty234',
    }
    param_parse = urlencode(data)
    req = request.Request(url, data=param_parse.encode('utf-8'), headers=header)
    res = opener.open(req)
    # 第二部 访问某人主页
    dapeng_url = 'http://www.renren.com/880151247/profile'
    # 不用新建opener,因为之前的已经包含了登录所需要的cookie信息
    resp = request.Request(dapeng_url, headers=header)
    req2 = opener.open(resp)
    with open('/Users/mac/PycharmProjects/TEST/TEST/爬虫day/file/renren3.html', 'w', encoding='utf-8') as f:
        f.write(req2.read().decode('utf-8'))
    

     代码优化

    from http.cookiejar import CookieJar
    from urllib.parse import urlencode
    
    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/75.0.3770.100 Safari/537.36',
    
    }
    
    
    # 第一步登录
    """
    1.1 创建一个cookiejar对象
    1.2,使用cookiejar创建一个HTTPCookieProcessor对象
    1.3,使用上一步创建的handler创建一个opener
    1.4, 使用opener发送登录的请求(人人网的邮箱和密码)
    """
    
    def get_opener():
        cookieJar = CookieJar()
        handler = request.HTTPCookieProcessor(cookieJar)
        opener = request.build_opener(handler)
        return opener
    
    def login_renren(opener):
    
        url = 'http://www.renren.com/PLogin.do'
        data = {
            'email': '15666809216',
            'password': 'beauty234',
        }
        param_parse = urlencode(data)
        req = request.Request(url, data=param_parse.encode('utf-8'), headers=header)
        res = opener.open(req)
        return res
    
    def visit_home(opener):
        # 第二部 访问某人主页
        dapeng_url = 'http://www.renren.com/880151247/profile'
        # 不用新建opener,因为之前的已经包含了登录所需要的cookie信息
        resp = request.Request(dapeng_url, headers=header)
        req2 = opener.open(resp)
        with open('/Users/mac/PycharmProjects/TEST/TEST/爬虫day/file/renren3.html', 'w', encoding='utf-8') as f:
            f.write(req2.read().decode('utf-8'))
    
    if __name__ == 'main':
        opener = get_opener()
        login_renren(opener)
        visit_home(opener)
    
  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/wangyue0925/p/11091308.html
Copyright © 2011-2022 走看看