使用Python模拟网站登录,验证码需要手动输入
首先用浏览器的F12工具记录网络中的所有请求,进行一次手动的登录,然后查看POST请求中的各项参数。 假设POST请求中有4个参数:__VIEWSTATE:页面状态,在之前的GET请求中可以获取到;txtUserName:用户名;txtPwd:密码;txtCheckCode:验证码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# encoding=utf-8 import sys import six import re import requests import Image def LoginByPost(username, password): # 创建一个session,否则无法保存cookie s = requests.session() # 使用GET获取一些状态参数 validation = 'http://*.*.*.*/UserLogin.aspx' res = s.get(validation, stream=True) res.encoding = 'utf-8' respon = res.text #使用正则表达式匹配获取登录时需要的一些POST信息 pattern = 'id="__VIEWSTATE" value="(.*)" />' a = re.search(pattern, respon) if a: a = a.group(1) VIEWSTATE = a # print VIEWSTATE # 获取验证码 imgUrl = 'http://*.*.*.*/pic.aspx' res = s.get(imgUrl, stream=True) res.encoding = 'utf-8' # 输入当前session的cookie信息 print(s.cookies.get_dict()) im = Image.open(six.BytesIO(res.content)) im.show() code = input('验证码:') # 登录 loginUrl = 'http://*.*.*.*/UserLogin.aspx' postData = {'txtUserName': xh,'txtPwd': password, 'txtCheckCode': code, '__VIEWSTATE': VIEWSTATE} # print postData # res.encoding = 'gb2312' 注意查看POST的编码方式 rs = s.post(loginUrl, postData) # print(res.text) # 获取一些信息 url = 'http://*.*.*.*/UserBaseInfo_Seach.aspx' res = s.get(url) res.encoding = 'utf-8' # 获取照片 url = 'http://*.*.*.*/Photo.aspx' res = s.get(url) if res.status_code == 200: with open('pic/%s.jpg' % xh, 'w') as f: f.write(res.content) # res.encoding = 'utf-8' logout = 'http://*.*.*.*/SYSLOGOUT.ASPX' res = s.get(logout) |