如果直接从生成验证码的页面把验证码下载到本地后识别,再构造表单数据发送的话,会有一个验证码同步的问题,即请求了两次验证码,而识别出来的验证码并不是实际需要发送的验证码。有如下几种方法解决。
<>强法1:强>
用会话:
mysession=requests.Session () login_url=' http://xxx.com ' checkcode_url=' http://yyy.com ' html=mysession.get (login_url超时=60 * 4) # .... balabala解析操作.... checkcode=mysession.get (checkcode_url超时=60 * 4) 张开(“checkcode.png”,“世界银行”)f: f.write (checkcode.content) #接下来balabala对图像操作,可以用python的相关库(识别率低,教务网的验证码都够呛),也可以用云速等第三方验证码识别网站提供的有偿服务(识别度较高) #再接下来构造表单数据balabala
<>强法2:强>
用饼干:
#绑定饼干 checkcode_url=' http://yyy.com ' 饼干=cookielib.CookieJar () 处理程序=urllib2.HTTPCookieProcessor(饼干) 刀=urllib2.build_opener(处理器) #先读取验证码的url 照片=opener.open (checkcode_url) .read () # balabala图像处理 #生成帖子数据 data=https://www.yisu.com/zixun/urllib.urlencode (postData) #构造请求请求=urllib2请求。请求(PostUrl、数据头) #利用之前存有饼干的揭幕战登录页面 试一试: 响应=opener.open(请求) 结果=response.read () urllib2除外。HTTPError e: 打印e.code
<>强法3:强>
硒+手动构造饼干:该方法无需识别验证码,本人尚未尝试。
webdriver操作饼的方法有:
-
<李> get_cookies()获得所有饼干信息李>
<李> get_cookie(名字)返回特定的名字有饼干信息李>
<李> add_cookie (cookie_dict)添加饼干,必须有名称和值值李>
<李> delete_cookie(名字)删除特定(部分)的饼干信息李>
<李> delete_all_cookies()删除所有饼干信息李>
… #第一次访问xxx网站 driver.get (“http://xxx.com”) #将用户名密码写入浏览器饼干 driver.add_cookie({“名称”:“用户名”,“价值”:“用户名”}) driver.add_cookie({“名称”:“密码”,“价值”:“密码”}) #再次访问xxx网站,将会自动登录 driver.get (“http://xxx.com”) time . sleep (5) … driver.quit ()
这种方法难点在于确定该网站是用饼干中的什么键值来表示”用户名”和“密码”的。而且好像有些饼干是加密过的。可以先用get_cookies()进行观察。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。