zoukankan      html  css  js  c++  java
  • 用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()
  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/shawone/p/10264852.html
Copyright © 2011-2022 走看看