最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章!

淘宝登录就比较复杂,为什么说复杂呢?因为淘宝登录涉及参数多且请求不止一次!我们就先来讲讲淘宝登录的流程,先把流程原理搞懂,再去敲代码,这样大家就容易理解!
一、淘宝登录流程
为了便于大家理解,画了一个非标准的淘宝登录请求时序图

淘宝ua参数:ua(User-Agent)故名用户代理,淘宝的ua参数加入了浏览器、ip、电脑、时间等信息,然后加密生成,在很多地方使用,不仅仅是登录!
上图是比较详细的流程图,从代码层面考虑将模拟登录淘宝分为以下四个步骤:
1、输入用户名后,浏览器会向淘宝()发起一个post的请求,判断是否出现滑块验证!
2、用户输入密码后,浏览器向淘宝()又发起一个post请求,验证用户名密码是否正确,如果正确则返回一个token。
3、浏览器拿着token去阿里巴巴()交换st码!
4、浏览器获取st码之后,拿着st码获取cookies,登录成功
这里也许有同学会提出疑问:为什么淘宝()验证通过之后还要拿着token去阿里巴巴()交换st码呢?这个我们放后面讲!
二、模拟登录实现
上面我们只讲了大概的登录流程,这里猪哥会先详细讲解下每一步的操作,然后再贴出实现代码!
1.判断是否需要验证码
目前我们在登录淘宝的时候,大多数情况下是不会出现滑块验证码,猪哥尝试了很多次的登录退出也只是在中间出现过一次,那究竟是什么在控制是否需要滑块验证码的呢?

从上图可以看出,当输入用户名后,浏览器就会发起一个post请求,来验证是否需要出现滑块验证码,如果返回true,滑块验证码则出现!否则不出现,一般是不会出现!
图中我们可以看到这次post请求上传了两个参数:username、ua!
ua为浏览器、ip、设备信息等多信息加密参数,所以猜想淘宝的验证码是否出现不仅仅从账号角度,还有ip、设备等角度!
举个例子:某台设备可能出现登录过大量的账号,这时候淘宝就可以从ua参数中获取设备号,然后对该设备进行限制!
知道了流程和请求链接及参数之后,我们就可以用代码来请求了!

2.验证用户名密码
这里一步也就是上面时序图图中的第5步:请求登录,这里会将用户名、ua参数、加密密码等30十几个参数post到淘宝()去验证。

我们来用代码实现一下,大家别被这么多参数吓到,都是从浏览器复制过来的!

看看请求结果!

可以看到申请st码链接后面带了一个token,具体token是干什么用的后面我们再分析!
3.申请st码
上面我们已经申请到了淘宝()的token,这一步就是用token来换取st码。
到这里很多人可能会有疑问:为什么淘宝登录需要这么麻烦呢?直接在登录不就可以吗?为什么要先在taobao验证用户名密码,通过之后再去换取st码登录呢?
任何公司的框架都是慢慢演变的结果,我想最开始的淘宝登录肯定没这么复杂。但是随着阿里巴巴的慢慢壮大,很多事业线都划分开来,但是这些事业线之间又有关联性,比如用户登录了淘宝账号之后天猫就不需要再登录了呢?(注意淘宝和天猫的顶级域名不同,所以不能共享cookis)为了解决这个问题,单点登录就出现了。
单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。——百度百科
很多大企业几乎都有做单点登录,那阿里的单点登录系统肯定是由母公司阿里巴巴()来做啦,所有子公司去调用母公司接口!
我们再回来分析淘宝登录为何要如此复杂就很好理解了:用户数据在淘宝这里,所以需要现在淘宝()验证用户名和密码,验证通过生成一个token,浏览器拿着token去和阿里巴巴()申请单点登录码(st码),阿里巴巴收到请求验证token通过则返回st码,所以用token换st码的原因就在于单点登录!
理解了设计原理之后,代码实现起来就很清晰了!

4.使用st码登录
成功获取st码之后我们就可以来登录了,这一步是通过st码获取登录的cookies。

到这里我们就已经模拟登录淘宝成功了!
5.获取淘宝昵称
其实上面我们就已经登录淘宝成功并返回用户主页的链接,我们为了进一步验证登录成功,就请求一下淘宝用户主页,顺便把淘宝昵称提取出来吧!

三、总结
整体讲完之后我们来稍微总结一下吧,主要从代码结构和存在的问题两个方面说下:
1.代码结构
来放出一张代码结构图,让大家直观了解

这就是我们前面说过的模拟登录淘宝的四个步骤,不过这里我们是用代码实现了!
完整代码
importreimportosimportjsonimportrequests'''遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!'''s=()检测是否需要验证码的_check_url=''访问st码_url='{}'淘宝用户名=username加密后的密码,从浏览器或抓包工具中复制,可重复使用_password2=TPL_password2登录提交的数据,如果登录失败,可以从浏览器复制你的formdataverify_password_data={'TPL_username':,'ncoToken':'cdf05a89ad5104403ebb12ebc9b7626af277b066','slideCodeShow':'false','useMobile':'false','lang':'zh_CN','loginsite':0,'newlogin':0,'TPL_redirect_url':';imgfile=comm=allssid=s5-esearch_type=itemsourceId===utf8initiative_id=tbindexz_20170306','from':'tb','fc':'default','style':'default','keyLogin':'false','qrLogin':'true','newMini':'false','newMini2':'false','loginType':'3','gvfdcname':'10','gvfdcre':'68747470733A2F2F6C6F67696E2E74616F62616F2E636F6D2F6D656D6265722F6C6F676F75742E6A68746D6C3F73706D3D61323330722E312E3735343839343433372E372E33353836363032633279704A767526663D746F70266F75743D7472756526726564697265637455524C3D6874747073253341253246253246732E74616F62616F2E636F6D25324673656467125334425323545392532353830253235394625323545352532354241253235439253235383025323539462532354535253235424125323546D6766696C65253344253236636F6D6D656E64253344616C6C2532367373696425334473352D652532367365617263685F747970652533446974656D253236736F75726365496425334474622E696E64657825323673706D253344613231626F2E323031372E3230313835362D74616F62616F2D6974656D2E31253236696525334475746638253236696E69746961746976655F69642533447462696E6465787A5F32303','TPL_password_2':_password2,'loginASR':'1','loginASRSuc':'1','oslanguage':'zh-CN','sr':'1440*900','osVer':'macos|10.145','naviVer':'chrome|76.038091','osACN':'Mozilla','osAV':'5.0(Macintosh;IntelMacOSX10_14_5)AppleWebKit/537.36(KHTML,likeGecko)Chrome/76.0.3809.100Safari/537.36','osPF':'MacIntel','appkey':'00000000','mobileLoginLink':';imgfile=comm=allssid=s5-esearch_type=itemsourceId===utf8initiative_id=tbindexz_20170306useMobile=true','showAssistantLink':'','um_token':'T898C0FDF1A3CEE5389D682340C5F299FFE590F51543C8E3DDA8341C869','ua':}try:response=(_password_url,headers=verify_password_headers,data=verify_password_data,timeout=)_for_status()提取申请st码urlapply_st_url_match=(r'scriptsrc="(.*?)"/script',)加载cookies文件ifself._load_cookies():returnTrue登录成功,提取跳转淘宝用户主页urlmy_taobao_match=(r'="(.*?)"',)ifmy_taobao_match:print('登录淘宝成功,跳转链接:{}'.format(my_taobao_(1)))self._serialization_cookies()returnTrueelse:raiseRuntimeError('登录失败!response:{}'.format())def_load_cookies(self):2、加载=self._deserialization_cookies()提取淘宝昵称nick_name_match=(r'inputid="mtb-nickname"type="hidden"value="(.*?)"/',)ifnick_name_match:print('登录淘宝成功,你的用户名是:{}'.format(nick_name_(1)))returnnick_name_(1)else:raiseRuntimeError('获取淘宝昵称失败!response:{}'.format())if__name__=='__main__':淘宝重要参数,从浏览器或抓包工具中复制,可重复使用ua=ua='119加密后的密码,从浏览器或抓包工具中复制,可重复使用TPL_password2='8a65e84dbd099e3eb728bfbbbf6ecb2b759b50745120e186ad94b171e369dac0d877d0c816d49898ea166d2842469dcec0435e88d4f534ee502967eafd30976ca0424f9c4a65bfb8b27c1cd8cf68a3c94be4fb7bd4102095f34cfbfca2649eee9ac3ee3d2785789fc4de15279cfab6d6984c90ab557bb1ee83c187a4fd25698d'ul=UsernameLogin(username,ua,TPL_password2)()





