# 本练习是模拟登陆及验证码处理(把验证码下载到本地后手动输入) # 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()