python模拟浏览器登陆淘宝(设置代理、输入验证码)
终于实现了登陆淘宝,这个验证码机制困惑了我好几天啊。
代码中验证码提供有两种方式,第一种通过webbrowser的open直接在浏览器中打开含有验证码的图片,第二种就是将其以jepg格式存在
C:\\Users\\Administrator\\Desktop\\checkcode.jepg。你可以根据自己主机的用户名更改路径。同时这个代码必须先指定用户名和账号也
可以实时输入账号的密码,小小修改一下代码就可以。
显示根据httpfox分析网页数据,之后再使用正则扣除你想要的数据,将其显示出来。过几天可能会写一个从淘宝上抓取信息的爬虫,现在
还没有使用各种爬虫框架,基本都是使用urllib、urllib2等比较基础的包,过一阶段可能会学习到框架,我也只是一个菜鸟,一个想要飞的
更高的菜鸟罢了,代码里我写了比较详细的注释,基本逻辑就是初始化设置cookie等->发送post数据从返回信息中抓取验证码->再次发送
携带验证码的post数据->从返回信息中提取登陆状态。
# -*- coding: utf-8 -*- import urllib import urllib2 import cookielib #设置opener import re #正则表达式 import webbrowser #打开界面 #淘宝登录地址 tbLoginUrl = "https://login.taobao.com/member/login.jhtml" #存放验证码图片的网址 checkCodeUrl = '' #post请求头部 headers = { 'x-requestted-with': 'XMLHttpRequest', 'Accept-Language': 'zh-cn', 'Accept-Encoding': 'gzip, deflate', 'ContentType': 'application/x-www-form-urlencoded; chartset=UTF-8', 'Host': 'login.taobao.com', 'DNT': 1, 'Cache-Control': 'no-cache', 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1', 'Referer' : 'https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Fwww.taobao.com%2F', 'Connection' : 'Keep-Alive' } #设置用户名,密码 username = "" password = "" #同样可以采用实时输入模式 #username = raw_input("Please input your username of taobao: ") #password = raw_input("Please input your password of taobao: ") #请求数据包 postData = { 'TPL_username':username, 'TPL_password':password, "need_check_code" : "false", "loginsite": 0, "newlogin":1, 'TPL_redirect_url':'', 'from':'tbTop', 'fc':"default", 'style':'default', 'css_style':'', 'tid':'', 'support':'000001', 'CtrlVersion':'1,0,0,7', 'loginType':3, 'minititle':'', 'minipara' :'', "umto":"NAN", 'pstrong':2, 'llnick':'', 'sign':'', 'need_sign':'', "isIgnore":'', "full_redirect":'', 'popid':'', 'callback':'1', 'guf':'', 'not_duplite_str':'', 'need_user_id':'', 'poy':'', 'gvfdcname':10, 'from_encoding':'', "sub":'', "allp":'', 'action':'Authenticator', 'event_submit_do_login':'anything', 'longLogin':0 } #登录主函数 def loginToTaobao(): #设置代理IP,防止频率过高本地IP被封 urllib2.ProxyHandler({'http':'http://120.193.146.97:843'}) #cookie 自动处理器 cookiejar = cookielib.LWPCookieJar()#LWPCookieJar提供可读写操作的cookie文件,存储cookie对象 cookieSupport= urllib2.HTTPCookieProcessor(cookiejar) opener = urllib2.build_opener(cookieSupport, urllib2.HTTPHandler) urllib2.install_opener(opener) #打开登陆页面 taobao = urllib2.urlopen(tbLoginUrl) resp = taobao.read().decode("gbk") #此时直接发送post数据包到登陆地址 sendPostData(tbLoginUrl, postData, headers) #打开验证码图片的网页 webbrowser.open_new_tab(checkCodeUrl) #将验证码图片下载到本地 if checkCodeUrl != "": getCheckCode(checkCodeUrl) sendPostData(tbLoginUrl, postData, headers) #发送post数据到登陆网址 def sendPostData(url, data, header): print "+"*20+"sendPostData"+"+"*20 data = urllib.urlencode(data) request = urllib2.Request(url, data, header) response = urllib2.urlopen(request) text = response.read().decode("gbk") info = response.info() status = response.getcode() response.close() print status print info print "Response:", text #如果为第一次调用,则进入获取验证码的函数 if checkCodeUrl == "": global checkCodeUrl checkCodeUrl = getIdenCode(text) print checkCodeUrl result = handleResponseText(text) print result if result["state"]: print "successfully login in!" else: print "failed to login in, error message: ",result["message"] #利用正则得到存放二维码图片的网址 def getIdenCode(page): #得到验证码的图片 pattern = re.compile('ccurl":"(.*?)"',re.S) #匹配的结果 matchResult = re.search(pattern,page) #已经匹配得到内容,并且验证码图片链接不为空,返回(.*?)中的内容 if matchResult and matchResult.group(1): print matchResult.group(1) return matchResult.group(1) else: print u"没有找到验证码内容" return False #从数据中抓取网页登陆的状态,并输出到界面上 def handleResponseText(text): """处理登录返回结果""" global checkCodeUrl print "+"*20+"handleResponseText"+"+"*20 text = text.replace(',', ' ') responseData = {"state": False, "message" : "", "code" : ""} m1 = re.match(r'\{?"state":(\w*)\ ', text) if m1 is not None: s = m1.group(1) if s == "true": responseData["state"] = True else: m2 = re.search(r'"message":"(\S*)"( |})', text) if m2 is not None: msg = m2.group(1) responseData["message"] = msg.encode("utf-8") else: print "failed to get the error message" m3 = re.match(r'.+\"code":(\w*)\ ', text) if m3 is not None: code = m3.group(1) responseData["code"] = code else: print "failed to get the error code" return responseData #将图片存在本地路径中 def getCheckCode(url): print "+"*20+"getCheckCode"+"+"*20 response = urllib2.urlopen(url) status = response.getcode() picData = response.read() path = "C:\\Users\\Administrator\\Desktop\\checkcode.jepg" if status == 200: localPic = open(path, "wb") localPic.write(picData) localPic.close() print "请到%s,打开验证码图片"%path checkCode = raw_input("请输入验证码:") print checkCode, type(checkCode) postData["TPL_checkcode"] = checkCode postData["need_check_code"] = "true" else: print "failed to get Check Code, status: ",status if __name__ == "__main__": print "-"*54 print "|"+"+"*20+"京东放养的爬虫"+"+"*20+"|" print "-"*54+"\n\n" loginToTaobao()
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。