当前位置: 首页 > 科技观察

Python爬虫模拟登录有验证码

时间:2023-03-12 12:06:37 科技观察

的网站,爬取网站时经常会遇到需要登录的问题。这需要使用模拟登录方法。Python提供了一个强大的url库,做到这一点并不难。下面是一个登录学校教务系统的简单例子。首先,您必须了解cookies的作用。Cookies是一些网站为了识别用户身份和进行会话跟踪而存储在用户本地终端上的数据。所以我们需要使用Cookielib模块来保存网站的cookies。可以发现这个验证码是动态更新的,每次打开都不一样。一般这个验证码和cookie是同步的。其次,识别验证码肯定是吃力不讨好的事情,所以我们的思路是先访问验证码页面,保存验证码,获取登录cookie,然后直接post数据到登录地址。首先,使用抓包工具或者Firefox或者GoogleChrome分析需要在登录页面贴出的请求和header信息。以谷歌浏览器为例。在需要提交的表单数据中,txtUserName和TextBox2分别是用户名和密码。现在直接进入代码的关键部分!!importurllib2importcookielibimporturllibimportreimportsys'''模拟登录'''reload(sys)sys.setdefaultencoding("utf-8")#防止中文错误CaptchaUrl="http://202.115.80.153/CheckCode.aspx"PostUrl="http://202.115.80.153/default2.aspx"#验证码地址和post地址cookie=cookielib.CookieJar()handler=urllib2.HTTPCookieProcessor(cookie)opener=urllib2.build_opener(handler)#绑定cookies到cookielib自动管理的openercookieusername='username'password='password123'#用户名和密码picture=opener.open(CaptchaUrl).read()#使用openr访问验证码地址,获取cookielocal=open('e:/image.jpg','wb')local.write(picture)local.close()#本地保存验证码SecretCode=raw_input('输入验证码:')#打开保存的验证码图片输入postData={'__VIEWSTATE':'dDwyODE2NTM0OTg7Oz6pH0TWZk5t0lupp/tlA1L+rmL83g==','txtUserName':用户名,'TextBox2':密码,'txtSecretCode':SecretCode,'RadioButtonList1':'Student','Button1':'','lbLanguage':'','hidPdrs':'','hidsc':'',}#根据抓包信息构造表单头={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8','Connection':'keep-alive','Content-Type':'application/x-www-form-urlencoded','User-Agent':'Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/46.0.2490.86Safari/537.36',}#Constructheadersdata=urllib.urlencode(postData)基于抓包information#生成post数据?key1=value1&key2=value2的形式request=urllib2.Request(PostUrl,data,headers)#构造请求requesttry:response=opener.open(request)result=response.read().decode('gb2312')#因为网页编码为gb2312,需要解码printresult#登录后打印页面excepturllib2.HTTPError,e:printe.code#使用opener登录页面,登录成功前后带cookie,即可使用openr访问其他需要登录才能访问的页面