`
hereson
  • 浏览: 1427545 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Python爬虫实战五之模拟登录淘宝并获取所有订单

 
阅读更多
经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持。本篇内容1. python模拟登录淘宝网页2. 获取登录用户的所有订单详情3. 学会应对出现验证码的情况4. 体会一下复杂的模拟登录机制探索部分成果1. 淘宝的密码用了AES加密算法,最终将密码转化为256位,在POST时,传输的是256位长度的密码。2. 淘宝在登录时必须要输入验证码,在经过几次尝试失败后最终获取了验证码图片让用户手动输入来验证。3. 淘宝另外有复杂且每天在变的 ua 加密算法,在程序中我们需要提前获取某一 ua 码才可进行模拟登录。4. 在获取最后的登录 st 码时,历经了多次请求和正则表达式提取,且 st 码只可使用一次。整体思路梳理1. 手动到浏览器获取 ua 码以及 加密后的密码,只获取一次即可,一劳永逸。2. 向登录界面发送登录请求,POST 一系列参数,包括 ua 码以及密码等等,获得响应,提取验证码图像。3. 用户输入手动验证码,重新加入验证码数据再次用 POST 方式发出请求,获得响应,提取 J_Htoken。4. 利用 J_Htoken 向 alipay 发出请求,获得响应,提取 st 码。5. 利用 st 码和用户名,重新发出登录请求,获得响应,提取重定向网址,存储 cookie。6. 利用 cookie 向其他个人页面如订单页面发出请求,获得响应,提取订单详情。是不是没看懂?没事,下面我将一点点说明自己模拟登录的过程,希望大家可以理解。前期准备由于淘宝的 ua 算法和 aes 密码加密算法太复杂了,ua 算法在淘宝每天都是在变化的,不过,这个内容你获取之后一直用即可,经过测试之后没有问题,一劳永逸。那么 ua 和 aes 密码怎样获取呢?我们就从浏览器里面直接获取吧,打开浏览器,找到淘宝的登录界面,按 F12 或者浏览器右键审查元素。在这里我用的是火狐浏览器,首先记得在浏览器中设置一下显示持续日志,要不然页面跳转了你就看不到之前抓取的信息了。在这里截图如下:20150225013600好,那么接下来我们就从浏览器中获取 ua 和 aes 密码点击网络选项卡,这时都是空的,什么数据也没有截取。这时你就在网页上登录一下试试吧,输入用户名啊,密码啊,有必要时需要输入验证码,点击登录。QQ截图20150225014124等跳转成功后,你就可以看到好多日志记录了,点击图中的那一行 login.taobo.com,然后查看参数,你就会发现表单数据了,其中就包括 ua 还有下面的 password2,把这俩复制下来,我们之后要用到的。这就是我们需要的 ua 还有 aes 加密后的密码。QQ截图20150225014019恩,读到这里,你应该获取到了属于自己的 ua 和 password2 两个内容。输入验证码并获取J_HToken经过博主本人亲自验证,有时候,在模拟登录时你并不需要输入验证码,它直接返回的结果就是前面所说的下一步用到的 J_Token,而有时候你则会需要输入验证码,等你手动输入验证码之后,重新请求登录一次。博主是边写程序边更新文章的,现在写完了是否有必要输入验证码的检验以及在浏览器中呈现验证码。代码如下123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151__author__ = 'CQC'# -*- coding:utf-8 -*-import urllibimport urllib2import cookielibimport reimport webbrowser#模拟登录淘宝类class Taobao:#初始化方法def __init__(self):#登录的URLself.loginURL = "https://login.taobao.com/member/login.jhtml"#代理IP地址,防止自己的IP被封禁self.proxyURL = 'http://120.193.146.97:843'#登录POST数据时发送的头部信息self.loginHeaders ={'Host':'login.taobao.com','User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0','Referer' : 'https://login.taobao.com/member/login.jhtml','Content-Type': 'application/x-www-form-urlencoded','Connection' : 'Keep-Alive'}#用户名self.username = 'cqcre'#ua字符串,经过淘宝ua算法计算得出,包含了时间戳,浏览器,屏幕分辨率,随机数,鼠标移动,鼠标点击,其实还有键盘输入记录,鼠标移动的记录、点击的记录等等的信息self.ua = '191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThu9a==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='#密码,在这里不能输入真实密码,淘宝对此密码进行了加密处理,256位,此处为加密后的密码self.password2 = '7511aa68sx629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e140a4a2a4b5c253bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'self.post = post = {'ua':self.ua,'TPL_checkcode':'','CtrlVersion': '1,0,0,7','TPL_password':'','TPL_redirect_url':'http://i.taobao.com/my_taobao.htm?nekot=udm8087E1424147022443','TPL_username':self.username,'loginsite':'0','newlogin':'0','from':'tb','fc':'default','style':'default','css_style':'','tid':'XOR_1_000000000000000000000000000000_625C4720470A0A050976770A','support':'000001','loginType':'4','minititle':'','minipara':'','umto':'NaN','pstrong':'3','llnick':'','sign':'','need_sign':'','isIgnore':'','full_redirect':'','popid':'','callback':'','guf':'','not_duplite_str':'','need_user_id':'','poy':'','gvfdcname':'10','gvfdcre':'','from_encoding ':'','sub':'','TPL_password_2':self.password2,'loginASR':'1','loginASRSuc':'1','allp':'','oslanguage':'zh-CN','sr':'1366*768','osVer':'windows|6.1','naviVer':'firefox|35'}#将POST的数据进行编码转换self.postData = urllib.urlencode(self.post)#设置代理self.proxy = urllib2.ProxyHandler({'http':self.proxyURL})#设置cookieself.cookie = cookielib.LWPCookieJar()#设置cookie处理器self.cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)#设置登录时用到的opener,它的open方法相当于urllib2.urlopenself.opener = urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)#得到是否需要输入验证码,这次请求的相应有时会不同,有时需要验证有时不需要def needIdenCode(self):#第一次登录获取验证码尝试,构建requestrequest = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)#得到第一次登录尝试的相应response = self.opener.open(request)#获取其中的内容content = response.read().decode('gbk')#获取状态吗status = response.getcode()#状态码为200,获取成功if status == 200:print u"获取请求成功"#u8bf7u8f93u5165u9a8cu8bc1u7801这六个字是请输入验证码的utf-8编码pattern = re.compile(u'u8bf7u8f93u5165u9a8cu8bc1u7801',re.S)result = re.search(pattern,content)#如果找到该字符,代表需要输入验证码if result:print u"此次安全验证异常,您需要输入验证码"return content#否则不需要else:print u"此次安全验证通过,您这次不需要输入验证码"return Falseelse:print u"获取请求失败"#得到验证码图片def getIdenCode(self,page):#得到验证码的图片pattern = re.compile('(.*?).*?u8ba2u5355u53f7.*?(.*?).*?shopname.*?title="(.*?)".*?baobei-name">.*?(.*?).*?'u'price.*?title="(.*?)".*?quantity.*?title="(.*?)".*?amount.*?em.*?>(.*?).*?trade-status.*?(.*?)',re.S)result = re.findall(pattern,page)for item in result:print '------------------------------------------------------------'print "购买日期:",item[0].strip(), '订单号:',item[1].strip(),'卖家店铺:',item[2].strip()print '宝贝名称:',item[3].strip()print '原价:',item[4].strip(),'购买数量:',item[5].strip(),'实际支付:',item[6].strip(),'交易状态',item[7].strip()最终代码整理恩,你懂得,最重要的东西来了,经过博主2天多的奋战,代码基本就构建完成。写了两个类,其中提取页面信息的方法我单独放到了一个类中,叫 tool.py,类名为 Tool。先看一下运行结果吧~QQ截图20150225234414最终代码如下1tool.py123456789101112131415161718192021222324252627282930313233__author__ = 'CQC'# -*- coding:utf-8 -*-import re#处理获得的宝贝页面class Tool:#初始化def __init__(self):pass#获得页码数def getPageNum(self,page):pattern = re.compile(u'.*?u5171(.*?)u9875',re.S)result = re.search(pattern,page)if result:print "找到了共多少页"pageNum = result.group(1).strip()print '共',pageNum,'页'return pageNumdef getGoodsInfo(self,page):#u'u8ba2u5355u53f7'是订单号的编码pattern = re.compile(u'dealtime.*?>(.*?).*?u8ba2u5355u53f7.*?(.*?).*?shopname.*?title="(.*?)".*?baobei-name">.*?(.*?).*?'u'price.*?title="(.*?)".*?quantity.*?title="(.*?)".*?amount.*?em.*?>(.*?).*?trade-status.*?(.*?)',re.S)result = re.findall(pattern,page)for item in result:print '------------------------------------------------------------'print "购买日期:",item[0].strip(), '订单号:',item[1].strip(),'卖家店铺:',item[2].strip()print '宝贝名称:',item[3].strip()print '原价:',item[4].strip(),'购买数量:',item[5].strip(),'实际支付:',item[6].strip(),'交易状态',item[7].strip()1taobao.py123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285__author__ = 'CQC'# -*- coding:utf-8 -*-import urllibimport urllib2import cookielibimport reimport webbrowserimport tool#模拟登录淘宝类class Taobao:#初始化方法def __init__(self):#登录的URLself.loginURL = "https://login.taobao.com/member/login.jhtml"#代理IP地址,防止自己的IP被封禁self.proxyURL = 'http://120.193.146.97:843'#登录POST数据时发送的头部信息self.loginHeaders ={'Host':'login.taobao.com','User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0','Referer' : 'https://login.taobao.com/member/login.jhtml','Content-Type': 'application/x-www-form-urlencoded','Connection' : 'Keep-Alive'}#用户名self.username = 'cqcre'#ua字符串,经过淘宝ua算法计算得出,包含了时间戳,浏览器,屏幕分辨率,随机数,鼠标移动,鼠标点击,其实还有键盘输入记录,鼠标移动的记录、点击的记录等等的信息self.ua = '191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThuOA==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='#密码,在这里不能输入真实密码,淘宝对此密码进行了加密处理,256位,此处为加密后的密码self.password2 = '7511aa6854629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e140a4a2a4b53bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'self.post = post = {'ua':self.ua,'TPL_checkcode':'','CtrlVersion': '1,0,0,7','TPL_password':'','TPL_redirect_url':'http://i.taobao.com/my_taobao.htm?nekot=udm8087E1424147022443','TPL_username':self.username,'loginsite':'0','newlogin':'0','from':'tb','fc':'default','style':'default','css_style':'','tid':'XOR_1_000000000000000000000000000000_625C4720470A0A050976770A','support':'000001','loginType':'4','minititle':'','minipara':'','umto':'NaN','pstrong':'3','llnick':'','sign':'','need_sign':'','isIgnore':'','full_redirect':'','popid':'','callback':'','guf':'','not_duplite_str':'','need_user_id':'','poy':'','gvfdcname':'10','gvfdcre':'','from_encoding ':'','sub':'','TPL_password_2':self.password2,'loginASR':'1','loginASRSuc':'1','allp':'','oslanguage':'zh-CN','sr':'1366*768','osVer':'windows|6.1','naviVer':'firefox|35'}#将POST的数据进行编码转换self.postData = urllib.urlencode(self.post)#设置代理self.proxy = urllib2.ProxyHandler({'http':self.proxyURL})#设置cookieself.cookie = cookielib.LWPCookieJar()#设置cookie处理器self.cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)#设置登录时用到的opener,它的open方法相当于urllib2.urlopenself.opener = urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)#赋值J_HTokenself.J_HToken = ''#登录成功时,需要的Cookieself.newCookie = cookielib.CookieJar()#登陆成功时,需要的一个新的openerself.newOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.newCookie))#引入工具类self.tool = tool.Tool()#得到是否需要输入验证码,这次请求的相应有时会不同,有时需要验证有时不需要def needCheckCode(self):#第一次登录获取验证码尝试,构建requestrequest = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)#得到第一次登录尝试的相应response = self.opener.open(request)#获取其中的内容content = response.read().decode('gbk')#获取状态吗status = response.getcode()#状态码为200,获取成功if status == 200:print u"获取请求成功"#u8bf7u8f93u5165u9a8cu8bc1u7801这六个字是请输入验证码的utf-8编码pattern = re.compile(u'u8bf7u8f93u5165u9a8cu8bc1u7801',re.S)result = re.search(pattern,content)#如果找到该字符,代表需要输入验证码if result:print u"此次安全验证异常,您需要输入验证码"return content#否则不需要else:#返回结果直接带有J_HToken字样,表明直接验证通过tokenPattern = re.compile('id="J_HToken" value="(.*?)"')tokenMatch = re.search(tokenPattern,content)if tokenMatch:self.J_HToken = tokenMatch.group(1)print u"此次安全验证通过,您这次不需要输入验证码"return Falseelse:print u"获取请求失败"return None#得到验证码图片def getCheckCode(self,page):#得到验证码的图片pattern = re.compile('<img id="J_StandardCode_m.*?data-src="(.*?)"',re.S)#匹配的结果matchResult = re.search(pattern,page)#已经匹配得到内容,并且验证码图片链接不为空if matchResult and matchResult.group(1):return matchResult.group(1)else:print u"没有找到验证码内容"return False#输入验证码,重新请求,如果验证成功,则返回J_HTokendef loginWithCheckCode(self):#提示用户输入验证码checkcode = raw_input('请输入验证码:')#将验证码重新添加到post的数据中self.post['TPL_checkcode'] = checkcode#对post数据重新进行编码self.postData = urllib.urlencode(self.post)try:#再次构建请求,加入验证码之后的第二次登录尝试request = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)#得到第一次登录尝试的相应response = self.opener.open(request)#获取其中的内容content = response.read().decode('gbk')#检测验证码错误的正则表达式,u9a8cu8bc1u7801u9519u8bef 是验证码错误五个字的编码pattern = re.compile(u'u9a8cu8bc1u7801u9519u8bef',re.S)result = re.search(pattern,content)#如果返回页面包括了,验证码错误五个字if result:print u"验证码输入错误"return Falseelse:#返回结果直接带有J_HToken字样,说明验证码输入成功,成功跳转到了获取HToken的界面tokenPattern = re.compile('id="J_HToken" value="(.*?)"')tokenMatch = re.search(tokenPattern,content)#如果匹配成功,找到了J_HTokenif tokenMatch:print u"验证码输入正确"self.J_HToken = tokenMatch.group(1)return tokenMatch.group(1)else:#匹配失败,J_Token获取失败print u"J_Token获取失败"return Falseexcept urllib2.HTTPError, e:print u"连接服务器出错,错误原因",e.reasonreturn False#通过token获得stdef getSTbyToken(self,token):tokenURL = 'https://passport.alipay.com/mini_apply_st.js?site=0&token=%s&callback=stCallback6' % tokenrequest = urllib2.Request(tokenURL)response = urllib2.urlopen(request)#处理st,获得用户淘宝主页的登录地址pattern = re.compile('{"st":"(.*?)"}',re.S)result = re.search(pattern,response.read())#如果成功匹配if result:print u"成功获取st码"#获取st的值st = result.group(1)return stelse:print u"未匹配到st"return False#利用st码进行登录,获取重定向网址def loginByST(self,st,username):stURL = 'https://login.taobao.com/member/vst.htm?st=%s&TPL_username=%s' % (st,username)headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0','Host':'login.taobao.com','Connection' : 'Keep-Alive'}request = urllib2.Request(stURL,headers = headers)response = self.newOpener.open(request)content =response.read().decode('gbk')#检测结果,看是否登录成功pattern = re.compile('top.location = "(.*?)"',re.S)match = re.search(pattern,content)if match:print u"登录网址成功"location = match.group(1)return Trueelse:print "登录失败"return False#获得已买到的宝贝页面def getGoodsPage(self,pageIndex):goodsURL = 'http://buyer.trade.taobao.com/trade/itemlist/listBoughtItems.htm?action=itemlist/QueryAction&event_submit_do_query=1' + '&pageNum=' + str(pageIndex)response = self.newOpener.open(goodsURL)page =response.read().decode('gbk')return page#获取所有已买到的宝贝信息def getAllGoods(self,pageNum):print u"获取到的商品列表如下"for x in range(1,int(pageNum)+1):page = self.getGoodsPage(x)self.tool.getGoodsInfo(page)#程序运行主干def main(self):#是否需要验证码,是则得到页面内容,不是则返回FalseneedResult = self.needCheckCode()#请求获取失败,得到的结果是Noneif not needResult ==None:if not needResult == False:print u"您需要手动输入验证码"checkCode = self.getCheckCode(needResult)#得到了验证码的链接if not checkCode == False:print u"验证码获取成功"print u"请在浏览器中输入您看到的验证码"webbrowser.open_new_tab(checkCode)self.loginWithCheckCode()#验证码链接为空,无效验证码else:print u"验证码获取失败,请重试"else:print u"不需要输入验证码"else:print u"请求登录页面失败,无法确认是否需要验证码"#判断token是否正常获取到if not self.J_HToken:print "获取Token失败,请重试"return#获取st码st = self.getSTbyToken(self.J_HToken)#利用st进行登录result = self.loginByST(st,self.username)if result:#获得所有宝贝的页面page = self.getGoodsPage(1)pageNum = self.tool.getPageNum(page)self.getAllGoods(pageNum)else:print u"登录失败"taobao = Taobao()taobao.main()好啦,运行结果就是上面贴的图片,可以成功获取到自己的商品列表,前提是把你们的 用户名,ua,password2这三个设置好。以上均为博主亲身所敲,代码写的不好,谨在此贴出和大家一起分享经验~小伙伴们试一下吧,希望对大家有帮助~

经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持。<br /><br />本篇内容<br />1. python模拟登录淘宝网页<br /><br />2. 获取登录用户的所有订单详情<br /><br />3. 学会应对出现验证码的情况<br /><br />4. 体会一下复杂的模拟登录机制<br /><br />探索部分成果<br />1. 淘宝的密码用了AES加密算法,最终将密码转化为256位,在POST时,传输的是256位长度的密码。<br /><br />2. 淘宝在登录时必须要输入验证码,在经过几次尝试失败后最终获取了验证码图片让用户手动输入来验证。<br /><br />3. 淘宝另外有复杂且每天在变的 ua 加密算法,在程序中我们需要提前获取某一 ua 码才可进行模拟登录。<br /><br />4. 在获取最后的登录 st 码时,历经了多次请求和正则表达式提取,且 st 码只可使用一次。<br /><br />整体思路梳理<br />1. 手动到浏览器获取 ua 码以及 加密后的密码,只获取一次即可,一劳永逸。<br /><br />2. 向登录界面发送登录请求,POST 一系列参数,包括 ua 码以及密码等等,获得响应,提取验证码图像。<br /><br />3. 用户输入手动验证码,重新加入验证码数据再次用 POST 方式发出请求,获得响应,提取 J_Htoken。<br /><br />4. 利用 J_Htoken 向 alipay 发出请求,获得响应,提取 st 码。<br /><br />5. 利用 st 码和用户名,重新发出登录请求,获得响应,提取重定向网址,存储 cookie。<br /><br />6. 利用 cookie 向其他个人页面如订单页面发出请求,获得响应,提取订单详情。<br /><br />是不是没看懂?没事,下面我将一点点说明自己模拟登录的过程,希望大家可以理解。<br /><br />前期准备<br />由于淘宝的 ua 算法和 aes 密码加密算法太复杂了,ua 算法在淘宝每天都是在变化的,不过,这个内容你获取之后一直用即可,经过测试之后没有问题,一劳永逸。<br /><br />那么 ua 和 aes 密码怎样获取呢?<br /><br />我们就从浏览器里面直接获取吧,打开浏览器,找到淘宝的登录界面,按 F12 或者浏览器右键审查元素。<br /><br />在这里我用的是火狐浏览器,首先记得在浏览器中设置一下显示持续日志,要不然页面跳转了你就看不到之前抓取的信息了。在这里截图如下:<br /><br />20150225013600<br /><br />好,那么接下来我们就从浏览器中获取 ua 和 aes 密码<br /><br />点击网络选项卡,这时都是空的,什么数据也没有截取。这时你就在网页上登录一下试试吧,输入用户名啊,密码啊,有必要时需要输入验证码,点击登录。<br /><br />QQ截图20150225014124<br /><br />等跳转成功后,你就可以看到好多日志记录了,点击图中的那一行 login.taobo.com,然后查看参数,你就会发现表单数据了,其中就包括 ua 还有下面的 password2,把这俩复制下来,我们之后要用到的。这就是我们需要的 ua 还有 aes 加密后的密码。<br /><br />QQ截图20150225014019<br /><br />恩,读到这里,你应该获取到了属于自己的 ua 和 password2 两个内容。<br /><br />输入验证码并获取J_HToken<br />经过博主本人亲自验证,有时候,在模拟登录时你并不需要输入验证码,它直接返回的结果就是前面所说的下一步用到的 J_Token,而有时候你则会需要输入验证码,等你手动输入验证码之后,重新请求登录一次。<br /><br />博主是边写程序边更新文章的,现在写完了是否有必要输入验证码的检验以及在浏览器中呈现验证码。<br /><br />代码如下<br /><br /><br /><br />1<br /><br />2<br /><br />3<br /><br />4<br /><br />5<br /><br />6<br /><br />7<br /><br />8<br /><br />9<br /><br />10<br /><br />11<br /><br />12<br /><br />13<br /><br />14<br /><br />15<br /><br />16<br /><br />17<br /><br />18<br /><br />19<br /><br />20<br /><br />21<br /><br />22<br /><br />23<br /><br />24<br /><br />25<br /><br />26<br /><br />27<br /><br />28<br /><br />29<br /><br />30<br /><br />31<br /><br />32<br /><br />33<br /><br />34<br /><br />35<br /><br />36<br /><br />37<br /><br />38<br /><br />39<br /><br />40<br /><br />41<br /><br />42<br /><br />43<br /><br />44<br /><br />45<br /><br />46<br /><br />47<br /><br />48<br /><br />49<br /><br />50<br /><br />51<br /><br />52<br /><br />53<br /><br />54<br /><br />55<br /><br />56<br /><br />57<br /><br />58<br /><br />59<br /><br />60<br /><br />61<br /><br />62<br /><br />63<br /><br />64<br /><br />65<br /><br />66<br /><br />67<br /><br />68<br /><br />69<br /><br />70<br /><br />71<br /><br />72<br /><br />73<br /><br />74<br /><br />75<br /><br />76<br /><br />77<br /><br />78<br /><br />79<br /><br />80<br /><br />81<br /><br />82<br /><br />83<br /><br />84<br /><br />85<br /><br />86<br /><br />87<br /><br />88<br /><br />89<br /><br />90<br /><br />91<br /><br />92<br /><br />93<br /><br />94<br /><br />95<br /><br />96<br /><br />97<br /><br />98<br /><br />99<br /><br />100<br /><br />101<br /><br />102<br /><br />103<br /><br />104<br /><br />105<br /><br />106<br /><br />107<br /><br />108<br /><br />109<br /><br />110<br /><br />111<br /><br />112<br /><br />113<br /><br />114<br /><br />115<br /><br />116<br /><br />117<br /><br />118<br /><br />119<br /><br />120<br /><br />121<br /><br />122<br /><br />123<br /><br />124<br /><br />125<br /><br />126<br /><br />127<br /><br />128<br /><br />129<br /><br />130<br /><br />131<br /><br />132<br /><br />133<br /><br />134<br /><br />135<br /><br />136<br /><br />137<br /><br />138<br /><br />139<br /><br />140<br /><br />141<br /><br />142<br /><br />143<br /><br />144<br /><br />145<br /><br />146<br /><br />147<br /><br />148<br /><br />149<br /><br />150<br /><br />151<br /><br />__author__ = 'CQC'<br /><br /># -*- coding:utf-8 -*-<br /><br />import urllib<br /><br />import urllib2<br /><br />import cookielib<br /><br />import re<br /><br />import webbrowser<br /><br />#模拟登录淘宝类<br /><br />class Taobao:<br /><br />#初始化方法<br /><br />def __init__(self):<br /><br />#登录的URL<br /><br />self.loginURL = "https://login.taobao.com/member/login.jhtml"<br /><br />#代理IP地址,防止自己的IP被封禁<br /><br />self.proxyURL = 'http://120.193.146.97:843'<br /><br />#登录POST数据时发送的头部信息<br /><br />self.loginHeaders ={<br /><br />'Host':'login.taobao.com',<br /><br />'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0',<br /><br />'Referer' : 'https://login.taobao.com/member/login.jhtml',<br /><br />'Content-Type': 'application/x-www-form-urlencoded',<br /><br />'Connection' : 'Keep-Alive'<br /><br />}<br /><br />#用户名<br /><br />self.username = 'cqcre'<br /><br />#ua字符串,经过淘宝ua算法计算得出,包含了时间戳,浏览器,屏幕分辨率,随机数,鼠标移动,鼠标点击,其实还有键盘输入记录,鼠标移动的记录、点击的记录等等的信息<br /><br />self.ua = '191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThu9a==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='<br /><br />#密码,在这里不能输入真实密码,淘宝对此密码进行了加密处理,256位,此处为加密后的密码<br /><br />self.password2 = '7511aa68sx629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e140a4a2a4b5c253bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'<br /><br />self.post = post = {<br /><br />'ua':self.ua,<br /><br />'TPL_checkcode':'',<br /><br />'CtrlVersion': '1,0,0,7',<br /><br />'TPL_password':'',<br /><br />'TPL_redirect_url':'http://i.taobao.com/my_taobao.htm?nekot=udm8087E1424147022443',<br /><br />'TPL_username':self.username,<br /><br />'loginsite':'0',<br /><br />'newlogin':'0',<br /><br />'from':'tb',<br /><br />'fc':'default',<br /><br />'style':'default',<br /><br />'css_style':'',<br /><br />'tid':'XOR_1_000000000000000000000000000000_625C4720470A0A050976770A',<br /><br />'support':'000001',<br /><br />'loginType':'4',<br /><br />'minititle':'',<br /><br />'minipara':'',<br /><br />'umto':'NaN',<br /><br />'pstrong':'3',<br /><br />'llnick':'',<br /><br />'sign':'',<br /><br />'need_sign':'',<br /><br />'isIgnore':'',<br /><br />'full_redirect':'',<br /><br />'popid':'',<br /><br />'callback':'',<br /><br />'guf':'',<br /><br />'not_duplite_str':'',<br /><br />'need_user_id':'',<br /><br />'poy':'',<br /><br />'gvfdcname':'10',<br /><br />'gvfdcre':'',<br /><br />'from_encoding ':'',<br /><br />'sub':'',<br /><br />'TPL_password_2':self.password2,<br /><br />'loginASR':'1',<br /><br />'loginASRSuc':'1',<br /><br />'allp':'',<br /><br />'oslanguage':'zh-CN',<br /><br />'sr':'1366*768',<br /><br />'osVer':'windows|6.1',<br /><br />'naviVer':'firefox|35'<br /><br />}<br /><br />#将POST的数据进行编码转换<br /><br />self.postData = urllib.urlencode(self.post)<br /><br />#设置代理<br /><br />self.proxy = urllib2.ProxyHandler({'http':self.proxyURL})<br /><br />#设置cookie<br /><br />self.cookie = cookielib.LWPCookieJar()<br /><br />#设置cookie处理器<br /><br />self.cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)<br /><br />#设置登录时用到的opener,它的open方法相当于urllib2.urlopen<br /><br />self.opener = urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)<br /><br />#得到是否需要输入验证码,这次请求的相应有时会不同,有时需要验证有时不需要<br /><br />def needIdenCode(self):<br /><br />#第一次登录获取验证码尝试,构建request<br /><br />request = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)<br /><br />#得到第一次登录尝试的相应<br /><br />response = self.opener.open(request)<br /><br />#获取其中的内容<br /><br />content = response.read().decode('gbk')<br /><br />#获取状态吗<br /><br />status = response.getcode()<br /><br />#状态码为200,获取成功<br /><br />if status == 200:<br /><br />print u"获取请求成功"<br /><br />#u8bf7u8f93u5165u9a8cu8bc1u7801这六个字是请输入验证码的utf-8编码<br /><br />pattern = re.compile(u'u8bf7u8f93u5165u9a8cu8bc1u7801',re.S)<br /><br />result = re.search(pattern,content)<br /><br />#如果找到该字符,代表需要输入验证码<br /><br />if result:<br /><br />print u"此次安全验证异常,您需要输入验证码"<br /><br />return content<br /><br />#否则不需要<br /><br />else:<br /><br />print u"此次安全验证通过,您这次不需要输入验证码"<br /><br />return False<br /><br />else:<br /><br />print u"获取请求失败"<br /><br />#得到验证码图片<br /><br />def getIdenCode(self,page):<br /><br />#得到验证码的图片<br /><br />pattern = re.compile('<img src="(.*?)" border="0" />(.*?).*?u8ba2u5355u53f7.*?<i>(.*?)</i>.*?shopname.*?title="(.*?)".*?baobei-name"&gt;.*?(.*?).*?'<br /><br />u'price.*?title="(.*?)".*?quantity.*?title="(.*?)".*?amount.*?em.*?&gt;(.*?)</i>.*?trade-status.*?(.*?)',re.S)<br /><br />result = re.findall(pattern,page)<br /><br />for item in result:<br /><br />print '------------------------------------------------------------'<br /><br />print "购买日期:",item[0].strip(), '订单号:',item[1].strip(),'卖家店铺:',item[2].strip()<br /><br />print '宝贝名称:',item[3].strip()<br /><br />print '原价:',item[4].strip(),'购买数量:',item[5].strip(),'实际支付:',item[6].strip(),'交易状态',item[7].strip()<br /><br />最终代码整理<br />恩,你懂得,最重要的东西来了,经过博主2天多的奋战,代码基本就构建完成。写了两个类,其中提取页面信息的方法我单独放到了一个类中,叫 tool.py,类名为 Tool。<br /><br />先看一下运行结果吧~<br /><br />QQ截图20150225234414<br /><br />最终代码如下<br /><br /><br /><br />1<br /><br />tool.py<br /><br /><br /><br />1<br /><br />2<br /><br />3<br /><br />4<br /><br />5<br /><br />6<br /><br />7<br /><br />8<br /><br />9<br /><br />10<br /><br />11<br /><br />12<br /><br />13<br /><br />14<br /><br />15<br /><br />16<br /><br />17<br /><br />18<br /><br />19<br /><br />20<br /><br />21<br /><br />22<br /><br />23<br /><br />24<br /><br />25<br /><br />26<br /><br />27<br /><br />28<br /><br />29<br /><br />30<br /><br />31<br /><br />32<br /><br />33<br /><br />__author__ = 'CQC'<br /><br /># -*- coding:utf-8 -*-<br /><br />import re<br /><br />#处理获得的宝贝页面<br /><br />class Tool:<br /><br />#初始化<br /><br />def __init__(self):<br /><br />pass<br /><br />#获得页码数<br /><br />def getPageNum(self,page):<br /><br />pattern = re.compile(u'.*?u5171(.*?)u9875',re.S)<br /><br />result = re.search(pattern,page)<br /><br />if result:<br /><br />print "找到了共多少页"<br /><br />pageNum = result.group(1).strip()<br /><br />print '共',pageNum,'页'<br /><br />return pageNum<br /><br />def getGoodsInfo(self,page):<br /><br />#u'u8ba2u5355u53f7'是订单号的编码<br /><br />pattern = re.compile(u'dealtime.*?&gt;(.*?).*?u8ba2u5355u53f7.*?<i>(.*?)</i>.*?shopname.*?title="(.*?)".*?baobei-name"&gt;.*?(.*?).*?'<br /><br />u'price.*?title="(.*?)".*?quantity.*?title="(.*?)".*?amount.*?em.*?&gt;(.*?)</i>.*?trade-status.*?(.*?)',re.S)<br /><br />result = re.findall(pattern,page)<br /><br />for item in result:<br /><br />print '------------------------------------------------------------'<br /><br />print "购买日期:",item[0].strip(), '订单号:',item[1].strip(),'卖家店铺:',item[2].strip()<br /><br />print '宝贝名称:',item[3].strip()<br /><br />print '原价:',item[4].strip(),'购买数量:',item[5].strip(),'实际支付:',item[6].strip(),'交易状态',item[7].strip()<br /><br /><br /><br />1<br /><br />taobao.py<br /><br /><br /><br />1<br /><br />2<br /><br />3<br /><br />4<br /><br />5<br /><br />6<br /><br />7<br /><br />8<br /><br />9<br /><br />10<br /><br />11<br /><br />12<br /><br />13<br /><br />14<br /><br />15<br /><br />16<br /><br />17<br /><br />18<br /><br />19<br /><br />20<br /><br />21<br /><br />22<br /><br />23<br /><br />24<br /><br />25<br /><br />26<br /><br />27<br /><br />28<br /><br />29<br /><br />30<br /><br />31<br /><br />32<br /><br />33<br /><br />34<br /><br />35<br /><br />36<br /><br />37<br /><br />38<br /><br />39<br /><br />40<br /><br />41<br /><br />42<br /><br />43<br /><br />44<br /><br />45<br /><br />46<br /><br />47<br /><br />48<br /><br />49<br /><br />50<br /><br />51<br /><br />52<br /><br />53<br /><br />54<br /><br />55<br /><br />56<br /><br />57<br /><br />58<br /><br />59<br /><br />60<br /><br />61<br /><br />62<br /><br />63<br /><br />64<br /><br />65<br /><br />66<br /><br />67<br /><br />68<br /><br />69<br /><br />70<br /><br />71<br /><br />72<br /><br />73<br /><br />74<br /><br />75<br /><br />76<br /><br />77<br /><br />78<br /><br />79<br /><br />80<br /><br />81<br /><br />82<br /><br />83<br /><br />84<br /><br />85<br /><br />86<br /><br />87<br /><br />88<br /><br />89<br /><br />90<br /><br />91<br /><br />92<br /><br />93<br /><br />94<br /><br />95<br /><br />96<br /><br />97<br /><br />98<br /><br />99<br /><br />100<br /><br />101<br /><br />102<br /><br />103<br /><br />104<br /><br />105<br /><br />106<br /><br />107<br /><br />108<br /><br />109<br /><br />110<br /><br />111<br /><br />112<br /><br />113<br /><br />114<br /><br />115<br /><br />116<br /><br />117<br /><br />118<br /><br />119<br /><br />120<br /><br />121<br /><br />122<br /><br />123<br /><br />124<br /><br />125<br /><br />126<br /><br />127<br /><br />128<br /><br />129<br /><br />130<br /><br />131<br /><br />132<br /><br />133<br /><br />134<br /><br />135<br /><br />136<br /><br />137<br /><br />138<br /><br />139<br /><br />140<br /><br />141<br /><br />142<br /><br />143<br /><br />144<br /><br />145<br /><br />146<br /><br />147<br /><br />148<br /><br />149<br /><br />150<br /><br />151<br /><br />152<br /><br />153<br /><br />154<br /><br />155<br /><br />156<br /><br />157<br /><br />158<br /><br />159<br /><br />160<br /><br />161<br /><br />162<br /><br />163<br /><br />164<br /><br />165<br /><br />166<br /><br />167<br /><br />168<br /><br />169<br /><br />170<br /><br />171<br /><br />172<br /><br />173<br /><br />174<br /><br />175<br /><br />176<br /><br />177<br /><br />178<br /><br />179<br /><br />180<br /><br />181<br /><br />182<br /><br />183<br /><br />184<br /><br />185<br /><br />186<br /><br />187<br /><br />188<br /><br />189<br /><br />190<br /><br />191<br /><br />192<br /><br />193<br /><br />194<br /><br />195<br /><br />196<br /><br />197<br /><br />198<br /><br />199<br /><br />200<br /><br />201<br /><br />202<br /><br />203<br /><br />204<br /><br />205<br /><br />206<br /><br />207<br /><br />208<br /><br />209<br /><br />210<br /><br />211<br /><br />212<br /><br />213<br /><br />214<br /><br />215<br /><br />216<br /><br />217<br /><br />218<br /><br />219<br /><br />220<br /><br />221<br /><br />222<br /><br />223<br /><br />224<br /><br />225<br /><br />226<br /><br />227<br /><br />228<br /><br />229<br /><br />230<br /><br />231<br /><br />232<br /><br />233<br /><br />234<br /><br />235<br /><br />236<br /><br />237<br /><br />238<br /><br />239<br /><br />240<br /><br />241<br /><br />242<br /><br />243<br /><br />244<br /><br />245<br /><br />246<br /><br />247<br /><br />248<br /><br />249<br /><br />250<br /><br />251<br /><br />252<br /><br />253<br /><br />254<br /><br />255<br /><br />256<br /><br />257<br /><br />258<br /><br />259<br /><br />260<br /><br />261<br /><br />262<br /><br />263<br /><br />264<br /><br />265<br /><br />266<br /><br />267<br /><br />268<br /><br />269<br /><br />270<br /><br />271<br /><br />272<br /><br />273<br /><br />274<br /><br />275<br /><br />276<br /><br />277<br /><br />278<br /><br />279<br /><br />280<br /><br />281<br /><br />282<br /><br />283<br /><br />284<br /><br />285<br /><br />__author__ = 'CQC'<br /><br /># -*- coding:utf-8 -*-<br /><br />import urllib<br /><br />import urllib2<br /><br />import cookielib<br /><br />import re<br /><br />import webbrowser<br /><br />import tool<br /><br />#模拟登录淘宝类<br /><br />class Taobao:<br /><br />#初始化方法<br /><br />def __init__(self):<br /><br />#登录的URL<br /><br />self.loginURL = "https://login.taobao.com/member/login.jhtml"<br /><br />#代理IP地址,防止自己的IP被封禁<br /><br />self.proxyURL = 'http://120.193.146.97:843'<br /><br />#登录POST数据时发送的头部信息<br /><br />self.loginHeaders ={<br /><br />'Host':'login.taobao.com',<br /><br />'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0',<br /><br />'Referer' : 'https://login.taobao.com/member/login.jhtml',<br /><br />'Content-Type': 'application/x-www-form-urlencoded',<br /><br />'Connection' : 'Keep-Alive'<br /><br />}<br /><br />#用户名<br /><br />self.username = 'cqcre'<br /><br />#ua字符串,经过淘宝ua算法计算得出,包含了时间戳,浏览器,屏幕分辨率,随机数,鼠标移动,鼠标点击,其实还有键盘输入记录,鼠标移动的记录、点击的记录等等的信息<br /><br />self.ua = '191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThuOA==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='<br /><br />#密码,在这里不能输入真实密码,淘宝对此密码进行了加密处理,256位,此处为加密后的密码<br /><br />self.password2 = '7511aa6854629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e140a4a2a4b53bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'<br /><br />self.post = post = {<br /><br />'ua':self.ua,<br /><br />'TPL_checkcode':'',<br /><br />'CtrlVersion': '1,0,0,7',<br /><br />'TPL_password':'',<br /><br />'TPL_redirect_url':'http://i.taobao.com/my_taobao.htm?nekot=udm8087E1424147022443',<br /><br />'TPL_username':self.username,<br /><br />'loginsite':'0',<br /><br />'newlogin':'0',<br /><br />'from':'tb',<br /><br />'fc':'default',<br /><br />'style':'default',<br /><br />'css_style':'',<br /><br />'tid':'XOR_1_000000000000000000000000000000_625C4720470A0A050976770A',<br /><br />'support':'000001',<br /><br />'loginType':'4',<br /><br />'minititle':'',<br /><br />'minipara':'',<br /><br />'umto':'NaN',<br /><br />'pstrong':'3',<br /><br />'llnick':'',<br /><br />'sign':'',<br /><br />'need_sign':'',<br /><br />'isIgnore':'',<br /><br />'full_redirect':'',<br /><br />'popid':'',<br /><br />'callback':'',<br /><br />'guf':'',<br /><br />'not_duplite_str':'',<br /><br />'need_user_id':'',<br /><br />'poy':'',<br /><br />'gvfdcname':'10',<br /><br />'gvfdcre':'',<br /><br />'from_encoding ':'',<br /><br />'sub':'',<br /><br />'TPL_password_2':self.password2,<br /><br />'loginASR':'1',<br /><br />'loginASRSuc':'1',<br /><br />'allp':'',<br /><br />'oslanguage':'zh-CN',<br /><br />'sr':'1366*768',<br /><br />'osVer':'windows|6.1',<br /><br />'naviVer':'firefox|35'<br /><br />}<br /><br />#将POST的数据进行编码转换<br /><br />self.postData = urllib.urlencode(self.post)<br /><br />#设置代理<br /><br />self.proxy = urllib2.ProxyHandler({'http':self.proxyURL})<br /><br />#设置cookie<br /><br />self.cookie = cookielib.LWPCookieJar()<br /><br />#设置cookie处理器<br /><br />self.cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)<br /><br />#设置登录时用到的opener,它的open方法相当于urllib2.urlopen<br /><br />self.opener = urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)<br /><br />#赋值J_HToken<br /><br />self.J_HToken = ''<br /><br />#登录成功时,需要的Cookie<br /><br />self.newCookie = cookielib.CookieJar()<br /><br />#登陆成功时,需要的一个新的opener<br /><br />self.newOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.newCookie))<br /><br />#引入工具类<br /><br />self.tool = tool.Tool()<br /><br />#得到是否需要输入验证码,这次请求的相应有时会不同,有时需要验证有时不需要<br /><br />def needCheckCode(self):<br /><br />#第一次登录获取验证码尝试,构建request<br /><br />request = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)<br /><br />#得到第一次登录尝试的相应<br /><br />response = self.opener.open(request)<br /><br />#获取其中的内容<br /><br />content = response.read().decode('gbk')<br /><br />#获取状态吗<br /><br />status = response.getcode()<br /><br />#状态码为200,获取成功<br /><br />if status == 200:<br /><br />print u"获取请求成功"<br /><br />#u8bf7u8f93u5165u9a8cu8bc1u7801这六个字是请输入验证码的utf-8编码<br /><br />pattern = re.compile(u'u8bf7u8f93u5165u9a8cu8bc1u7801',re.S)<br /><br />result = re.search(pattern,content)<br /><br />#如果找到该字符,代表需要输入验证码<br /><br />if result:<br /><br />print u"此次安全验证异常,您需要输入验证码"<br /><br />return content<br /><br />#否则不需要<br /><br />else:<br /><br />#返回结果直接带有J_HToken字样,表明直接验证通过<br /><br />tokenPattern = re.compile('id="J_HToken" value="(.*?)"')<br /><br />tokenMatch = re.search(tokenPattern,content)<br /><br />if tokenMatch:<br /><br />self.J_HToken = tokenMatch.group(1)<br /><br />print u"此次安全验证通过,您这次不需要输入验证码"<br /><br />return False<br /><br />else:<br /><br />print u"获取请求失败"<br /><br />return None<br /><br />#得到验证码图片<br /><br />def getCheckCode(self,page):<br /><br />#得到验证码的图片<br /><br />pattern = re.compile('&lt;img id="J_StandardCode_m.*?data-src="(.*?)"',re.S)<br /><br />#匹配的结果<br /><br />matchResult = re.search(pattern,page)<br /><br />#已经匹配得到内容,并且验证码图片链接不为空<br /><br />if matchResult and matchResult.group(1):<br /><br />return matchResult.group(1)<br /><br />else:<br /><br />print u"没有找到验证码内容"<br /><br />return False<br /><br />#输入验证码,重新请求,如果验证成功,则返回J_HToken<br /><br />def loginWithCheckCode(self):<br /><br />#提示用户输入验证码<br /><br />checkcode = raw_input('请输入验证码:')<br /><br />#将验证码重新添加到post的数据中<br /><br />self.post['TPL_checkcode'] = checkcode<br /><br />#对post数据重新进行编码<br /><br />self.postData = urllib.urlencode(self.post)<br /><br />try:<br /><br />#再次构建请求,加入验证码之后的第二次登录尝试<br /><br />request = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)<br /><br />#得到第一次登录尝试的相应<br /><br />response = self.opener.open(request)<br /><br />#获取其中的内容<br /><br />content = response.read().decode('gbk')<br /><br />#检测验证码错误的正则表达式,u9a8cu8bc1u7801u9519u8bef 是验证码错误五个字的编码<br /><br />pattern = re.compile(u'u9a8cu8bc1u7801u9519u8bef',re.S)<br /><br />result = re.search(pattern,content)<br /><br />#如果返回页面包括了,验证码错误五个字<br /><br />if result:<br /><br />print u"验证码输入错误"<br /><br />return False<br /><br />else:<br /><br />#返回结果直接带有J_HToken字样,说明验证码输入成功,成功跳转到了获取HToken的界面<br /><br />tokenPattern = re.compile('id="J_HToken" value="(.*?)"')<br /><br />tokenMatch = re.search(tokenPattern,content)<br /><br />#如果匹配成功,找到了J_HToken<br /><br />if tokenMatch:<br /><br />print u"验证码输入正确"<br /><br />self.J_HToken = tokenMatch.group(1)<br /><br />return tokenMatch.group(1)<br /><br />else:<br /><br />#匹配失败,J_Token获取失败<br /><br />print u"J_Token获取失败"<br /><br />return False<br /><br />except urllib2.HTTPError, e:<br /><br />print u"连接服务器出错,错误原因",e.reason<br /><br />return False<br /><br />#通过token获得st<br /><br />def getSTbyToken(self,token):<br /><br />tokenURL = 'https://passport.alipay.com/mini_apply_st.js?site=0&token=%s&callback=stCallback6' % token<br /><br />request = urllib2.Request(tokenURL)<br /><br />response = urllib2.urlopen(request)<br /><br />#处理st,获得用户淘宝主页的登录地址<br /><br />pattern = re.compile('{"st":"(.*?)"}',re.S)<br /><br />result = re.search(pattern,response.read())<br /><br />#如果成功匹配<br /><br />if result:<br /><br />print u"成功获取st码"<br /><br />#获取st的值<br /><br />st = result.group(1)<br /><br />return st<br /><br />else:<br /><br />print u"未匹配到st"<br /><br />return False<br /><br />#利用st码进行登录,获取重定向网址<br /><br />def loginByST(self,st,username):<br /><br />stURL = 'https://login.taobao.com/member/vst.htm?st=%s&TPL_username=%s' % (st,username)<br /><br />headers = {<br /><br />'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0',<br /><br />'Host':'login.taobao.com',<br /><br />'Connection' : 'Keep-Alive'<br /><br />}<br /><br />request = urllib2.Request(stURL,headers = headers)<br /><br />response = self.newOpener.open(request)<br /><br />content =response.read().decode('gbk')<br /><br />#检测结果,看是否登录成功<br /><br />pattern = re.compile('top.location = "(.*?)"',re.S)<br /><br />match = re.search(pattern,content)<br /><br />if match:<br /><br />print u"登录网址成功"<br /><br />location = match.group(1)<br /><br />return True<br /><br />else:<br /><br />print "登录失败"<br /><br />return False<br /><br />#获得已买到的宝贝页面<br /><br />def getGoodsPage(self,pageIndex):<br /><br />goodsURL = 'http://buyer.trade.taobao.com/trade/itemlist/listBoughtItems.htm?action=itemlist/QueryAction&event_submit_do_query=1' + '&pageNum=' + str(pageIndex)<br /><br />response = self.newOpener.open(goodsURL)<br /><br />page =response.read().decode('gbk')<br /><br />return page<br /><br />#获取所有已买到的宝贝信息<br /><br />def getAllGoods(self,pageNum):<br /><br />print u"获取到的商品列表如下"<br /><br />for x in range(1,int(pageNum)+1):<br /><br />page = self.getGoodsPage(x)<br /><br />self.tool.getGoodsInfo(page)<br /><br />#程序运行主干<br /><br />def main(self):<br /><br />#是否需要验证码,是则得到页面内容,不是则返回False<br /><br />needResult = self.needCheckCode()<br /><br />#请求获取失败,得到的结果是None<br /><br />if not needResult ==None:<br /><br />if not needResult == False:<br /><br />print u"您需要手动输入验证码"<br /><br />checkCode = self.getCheckCode(needResult)<br /><br />#得到了验证码的链接<br /><br />if not checkCode == False:<br /><br />print u"验证码获取成功"<br /><br />print u"请在浏览器中输入您看到的验证码"<br /><br />webbrowser.open_new_tab(checkCode)<br /><br />self.loginWithCheckCode()<br /><br />#验证码链接为空,无效验证码<br /><br />else:<br /><br /><br /> <br />print u"验证码获取失败,请重试"<br /><br />else:<br /><br />print u"不需要输入验证码"<br /><br />else:<br /><br />print u"请求登录页面失败,无法确认是否需要验证码"<br /><br />#判断token是否正常获取到<br /><br />if not self.J_HToken:<br /><br />print "获取Token失败,请重试"<br /><br />return<br /><br />#获取st码<br /><br />st = self.getSTbyToken(self.J_HToken)<br /><br />#利用st进行登录<br /><br />result = self.loginByST(st,self.username)<br /><br />if result:<br /><br />#获得所有宝贝的页面<br /><br />page = self.getGoodsPage(1)<br /><br />pageNum = self.tool.getPageNum(page)<br /><br />self.getAllGoods(pageNum)<br /><br />else:<br /><br />print u"登录失败"<br /><br />taobao = Taobao()<br /><br />taobao.main()<br /><br />好啦,运行结果就是上面贴的图片,可以成功获取到自己的商品列表,前提是把你们的 用户名,ua,password2这三个设置好。<br /><br />以上均为博主亲身所敲,代码写的不好,谨在此贴出和大家一起分享经验~<br /><br />小伙伴们试一下吧,希望对大家有帮助~
分享到:
评论

相关推荐

    Python爬虫实战:数据采集、处理与分析

    Python爬虫实战:数据采集、处理与分析Python爬虫实战:数据采集、处理与分析Python爬虫实战:数据采集、处理与分析Python爬虫实战:数据采集、处理与分析Python爬虫实战:数据采集、处理与分析Python爬虫实战:数据...

    Python爬虫实战 - 模拟登陆各大网站

    Python爬虫实战 - 模拟登陆各大网站

    Python网络爬虫实战.pdf

    本书共8章,涵盖的内容有Python语言的基本语法、Python常用IDE的使用、Python第三方模块的导入使用、Python爬虫常用模块、Scrapy爬虫、Beautiful Soup爬虫、Mechanize模拟浏览器和Selenium模拟浏览器。本书所有源...

    python爬虫学习之淘宝模拟登录.docx

    python爬虫学习之淘宝模拟登录.docx

    老男孩最新周末班Python开发与Python爬虫实战视频教程 老男孩Python周末班视频教程.txt

    Python教程的具体内容包括了Python的所有基础开发技术,Python面向对象,Python高级开发技术,MySQL数据库,Python Web和Django,Python爬虫实战教学课程,更多有专门的章节对课程的作业进行讲解,极大的增加了学习...

    python爬虫实战日记.zip

    python爬虫实战日记.zippython爬虫实战日记.zippython爬虫实战日记.zippython爬虫实战日记.zippython爬虫实战日记.zippython爬虫实战日记.zippython爬虫实战日记.zippython爬虫实战日记.zippython爬虫实战日记....

    Python爬虫实战之获取淘宝商品信息

    《Python爬虫实战之获取淘宝商品信息》 主要用作获取淘宝商品页各个商品信息内容并进行存储 在此资源中详细的标注了各个内容的功能 感谢CSDN提供的平台、希望可以帮助到有需要的CSDN小伙伴!!!

    Python爬虫模拟登录带验证码网站

    爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法。python提供了强大的url库,想做到这个并不难。这里以登录学校教务系统为例,做一个简单的例子。 首先得明白cookie的作用,cookie是某些网站...

    Python网络爬虫实战

    一本比较基础的python爬虫实战书籍,这本书有助于对python爬虫的基础的巩固,同时也可以作为一本工具书使用。

    python爬虫实战-淘宝商品数据

    python爬虫实战-淘宝商品数据

    python爬虫淘宝京东拼多多

    python爬虫淘宝京东拼多多python爬虫淘宝京东拼多多python爬虫淘宝京东拼多多python爬虫淘宝京东拼多多python爬虫淘宝京东拼多多python爬虫淘宝京东拼多多python爬虫淘宝京东拼多多python爬虫淘宝京东拼多多python...

    Python-Python3爬虫实战JS加解密逆向教程

    Python-Python3爬虫实战JS加解密逆向教程

    python爬虫之淘宝模拟登录

    Python爬虫可以用于从网页中获取信息并进行各种处理和分析。以下是一个基本的Python爬虫示例: 1. 安装所需的库:首先,确保您已安装所需的库,在Python中常用的爬虫库包括requests、beautifulsoup4和lxml等。可以...

    Python爬虫实战+数据分析+数据可视化.zip

    Python爬虫实战+数据分析+数据可视化.zip

    Python爬虫实战入门教程.pdf

    主要特点: 由浅入深,从Python和Web前端基础开始讲起,逐步加深难度,层层递进。... 内容详实,从静态网站到动态网站,从单机爬虫到分布式爬虫,既包含基础知识点,又讲解了关键问题和难点分析,方便读者完成进阶。

    python爬虫项目实战

    基于python爬虫书籍,实战+技能 穿插交互学习 高清

    python爬虫实例教程

    python网络爬虫实战 pdf是一本由胡松涛所著的python教程工具书,作者以大量实例为基础详细介绍了网络爬虫的编写全过程,非常适合Python网络爬虫初学者以及相关专业师生使用! python网络爬虫实战电子书介绍 ...

    python爬虫第五周课程

    python爬虫第五周课程:使用scrapy requests库爬取知乎上面的文章信息。

Global site tag (gtag.js) - Google Analytics