• 用session模拟登陆,手动输入验证码


    # 本练习是模拟登陆及验证码处理(把验证码下载到本地后手动输入)
    
    # 1 通过分析页面获得form表单的登陆接口为 action="https://www.douban.com/accounts/login"
    # 2 通过抓包发现登陆除了发送账户密码和验证码外,还发送了另一个值:
    # form_email: 账户
    # form_password: 密码
    # captcha-solution: 验证码文本
    # captcha-id: 验证码的图片地址动态码
    
    import requests
    from lxml import etree
    
    def cap(captcha_data):
        """创建一个处理验证码的方法,主要逻辑就是请求验证码的url,然后把验证码图片下载到本地,人工识别后输入"""
        with open("captcha.jpg","wb") as f:
            f.write(captcha_data)
    
        # 手动输入验证码
        text = input("输入验证码:")
        return text
    
    def doubanlogin():
        """先创建一个方法"""
    
        login_url = "https://www.douban.com/accounts/login"
    
        # 实例化一个session对象,用来保存cookie信息
        session = requests.Session()
    
        # 创建headers
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}
    
        # 先发送一个get请求,用来获取需要的captcha-id
        # 获得html页面信息
        html = session.get(login_url,headers=headers).content.decode()
        # 使用etree方法把html转化为xpath可解析对象
        html_e = etree.HTML(html)
        # 通过xpath提取需要的信息,这是一个动态码,每次请求都会构建一个新的值
        captcha = html_e.xpath("//div[@class='captcha_block']/input[2]/@value")[0]
        # 构建完整的验证码地址
        captcha_url = "https://www.douban.com/misc/captcha?id={}&size=s".format(captcha)
        # 请求验证码地址获得验证码图片的数据
        captcha_data = session.get(captcha_url,headers=headers).content
        # 调用函数处理验证码数据
        text = cap(captcha_data)
    
        # 构建post请求需要的data数据
        data = {"form_email": "账号",
                "form_password": "密码",
                "captcha-solution": text,
                "captcha-id": captcha,
                "source": "index_nav"
                }
    
        # 发送post请求,获取登陆成功页面,到这一步就获得了登陆账号的cookie信息
        session.post(login_url,headers=headers,data=data)
    
        # 获得了cookie,就可以再发送get请求,获取个人主页信息
        response = session.get("https://www.douban.com/people/190027418/",headers=headers)
    
        with open("people.html","w",encoding="utf-8") as f:
            f.write(response.content.decode())
    
    
        print(response.content.decode())
    
    
    
    
    if __name__ == '__main__':
        doubanlogin()
  • 相关阅读:
    TCP 连接状态
    可视化垃圾回收算法
    flume-ng+Kafka+Storm+HDFS 实时系统搭建
    WeX5 IDE 手机移动开发+JAVA +大数据
    云计算高级运维工程师
    CentOS 5.8 上安装 systemtap-2.6
    SYSTEMTAP -ORACLE
    Apple激活日期查询
    Div 浮动到另一个div之上
    Python模块常用的几种安装方式
  • 原文地址:https://www.cnblogs.com/shawone/p/10264852.html
Copyright © 2020-2023  润新知