设为首页 加入收藏

TOP

用session模拟登陆,手动输入验证码
2019-01-20 20:08:32 】 浏览:43
Tags: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()

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇通过session模拟登陆 下一篇使用selenium和phantomJS浏览器登..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目