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

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

一、淘宝登录流程

为了便于大家理解,画了一个非标准的淘宝登录请求时序图

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

二、模拟登录实现

上面我们只讲了大概的登录流程,这里猪哥会先详细讲解下每一步的操作,然后再贴出实现代码!

1.判断是否需要验证码

目前我们在登录淘宝的时候,大多数情况下是不会出现滑块验证码,猪哥尝试了很多次的登录退出也只是在中间出现过一次,那究竟是什么在控制是否需要滑块验证码的呢?

从上图可以看出,当输入用户名后,浏览器就会发起一个post请求,来验证是否需要出现滑块验证码,如果返回true,滑块验证码则出现!否则不出现,一般是不会出现!

图中我们可以看到这次post请求上传了两个参数:username、ua!

ua为浏览器、ip、设备信息等多信息加密参数,所以猜想淘宝的验证码是否出现不仅仅从账号角度,还有ip、设备等角度!

举个例子:某台设备可能出现登录过大量的账号,这时候淘宝就可以从ua参数中获取设备号,然后对该设备进行限制!
知道了流程和请求链接及参数之后,我们就可以用代码来请求了!

2.验证用户名密码

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

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

看看请求结果!

可以看到申请st码链接后面带了一个token,具体token是干什么用的后面我们再分析!

3.申请st码

上面我们已经申请到了淘宝(taobao.com)的token,这一步就是用token来换取st码。

到这里很多人可能会有疑问:为什么淘宝登录需要这么麻烦呢?直接在 taobao.com 登录不就可以吗?为什么要先在taobao验证用户名密码,通过之后再去 alibaba.com 换取st码登录呢?

任何公司的框架都是慢慢演变的结果,我想最开始的淘宝登录肯定没这么复杂。但是随着阿里巴巴的慢慢壮大,很多事业线都划分开来,但是这些事业线之间又有关联性,比如用户登录了淘宝账号之后天猫就不需要再登录了呢?(注意淘宝和天猫的顶级域名不同,所以不能共享cookis)为了解决这个问题,单点登录就出现了。

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 ——百度百科
很多大企业几乎都有做单点登录,那阿里的单点登录系统肯定是由母公司阿里巴巴(alibaba.com)来做啦,所有子公司去调用母公司接口!

我们再回来分析淘宝登录为何要如此复杂就很好理解了:用户数据在淘宝这里,所以需要现在淘宝(taobao.com)验证用户名和密码,验证通过生成一个token,浏览器拿着token去和阿里巴巴(alibaba.com)申请单点登录码(st码),阿里巴巴收到请求验证token通过则返回st码,所以用token换st码的原因就在于单点登录!

理解了设计原理之后,代码实现起来就很清晰了!

4.使用st码登录

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

到这里我们就已经模拟登录淘宝成功了!

5.获取淘宝昵称

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

三、总结

整体讲完之后我们来稍微总结一下吧,主要从代码结构和存在的问题两个方面说下:

1.代码结构

来放出一张代码结构图,让大家直观了解

这就是我们前面说过的模拟登录淘宝的四个步骤,不过这里我们是用代码实现了!

完整代码

import re
import os
import jsonimport requests'''
遇到不懂的问题?Python学习交流群:1136201545满足你的需求,资料都已经上传群文件,可以自行下载!
'''s = requests.Session()
# cookies序列化文件
COOKIES_FILE_PATH = 'taobao_login_cookies.txt'class UsernameLogin:def __init__(self, username, ua, TPL_password2):"""账号登录对象:param username: 用户名:param ua: 淘宝的ua参数:param TPL_password2: 加密后的密码"""# 检测是否需要验证码的URLself.user_check_url = 'https://login.taobao.com/member/request_nick_check.do?_input_charset=utf-8'# 验证淘宝用户名密码URLself.verify_password_url = "https://login.taobao.com/member/login.jhtml"# 访问st码URLself.vst_url = 'https://login.taobao.com/member/vst.htm?st={}'# 淘宝个人 主页self.my_taobao_url = 'http://i.taobao.com/my_taobao.htm'# 淘宝用户名self.username = username# 淘宝关键参数,包含用户浏览器等一些信息,很多地方会使用,从浏览器或抓包工具中复制,可重复使用self.ua = ua# 加密后的密码,从浏览器或抓包工具中复制,可重复使用self.TPL_password2 = TPL_password2# 请求超时时间self.timeout = 3def _user_check(self):"""检测账号是否需要验证码:return:"""data = {'username': self.username,'ua': self.ua}try:response = s.post(self.user_check_url, data=data, timeout=self.timeout)response.raise_for_status()except Exception as e:print('检测是否需要验证码请求失败,原因:')raise eneedcode = response.json()['needcode']print('是否需要滑块验证:{}'.format(needcode))return needcodedef _verify_password(self):"""验证用户名密码,并获取st码申请URL:return: 验证成功返回st码申请地址"""verify_password_headers = {'Connection': 'keep-alive','Cache-Control': 'max-age=0','Origin': 'https://login.taobao.com','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36','Content-Type': 'application/x-www-form-urlencoded','Referer': 'https://login.taobao.com/member/login.jhtml?from=taobaoindex&f=top&style=&sub=true&redirect_url=https%3A%2F%2Fi.taobao.com%2Fmy_taobao.htm',}# 登录toabao.com提交的数据,如果登录失败,可以从浏览器复制你的form dataverify_password_data = {'TPL_username': self.username,'ncoToken': 'cdf05a89ad5104403ebb12ebc9b7626af277b066','slideCodeShow': 'false','useMobile': 'false','lang': 'zh_CN','loginsite': 0,'newlogin': 0,'TPL_redirect_url': 'https://s.taobao.com/search?q=%E9%80%9F%E5%BA%A6%E9%80%9F%E5%BA%A6&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306','from': 'tb','fc': 'default','style': 'default','keyLogin': 'false','qrLogin': 'true','newMini': 'false','newMini2': 'false','loginType': '3','gvfdcname': '10','gvfdcre': '68747470733A2F2F6C6F67696E2E74616F62616F2E636F6D2F6D656D6265722F6C6F676F75742E6A68746D6C3F73706D3D61323330722E312E3735343839343433372E372E33353836363032633279704A767526663D746F70266F75743D7472756526726564697265637455524C3D6874747073253341253246253246732E74616F62616F2E636F6D25324673656172636825334671253344253235453925323538302532353946253235453525323542412532354136253235453925323538302532353946253235453525323542412532354136253236696D6766696C65253344253236636F6D6D656E64253344616C6C2532367373696425334473352D652532367365617263685F747970652533446974656D253236736F75726365496425334474622E696E64657825323673706D253344613231626F2E323031372E3230313835362D74616F62616F2D6974656D2E31253236696525334475746638253236696E69746961746976655F69642533447462696E6465787A5F3230313730333036','TPL_password_2': self.TPL_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; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36','osPF': 'MacIntel','appkey': '00000000','mobileLoginLink': 'https://login.taobao.com/member/login.jhtml?redirectURL=https://s.taobao.com/search?q=%E9%80%9F%E5%BA%A6%E9%80%9F%E5%BA%A6&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&useMobile=true','showAssistantLink': '','um_token': 'T898C0FDF1A3CEE5389D682340C5F299FFE590F51543C8E3DDA8341C869','ua': self.ua}try:response = s.post(self.verify_password_url, headers=verify_password_headers, data=verify_password_data,timeout=self.timeout)response.raise_for_status()# 从返回的页面中提取申请st码地址except Exception as e:print('验证用户名和密码请求失败,原因:')raise e# 提取申请st码urlapply_st_url_match = re.search(r'<script src="(.*?)"></script>', response.text)# 存在则返回if apply_st_url_match:print('验证用户名密码成功,st码申请地址:{}'.format(apply_st_url_match.group(1)))return apply_st_url_match.group(1)else:raise RuntimeError('用户名密码验证失败!response:{}'.format(response.text))def _apply_st(self):"""申请st码:return: st码"""apply_st_url = self._verify_password()try:response = s.get(apply_st_url)response.raise_for_status()except Exception as e:print('申请st码请求失败,原因:')raise est_match = re.search(r'"data":{"st":"(.*?)"}', response.text)if st_match:print('获取st码成功,st码:{}'.format(st_match.group(1)))return st_match.group(1)else:raise RuntimeError('获取st码失败!response:{}'.format(response.text))def login(self):"""使用st码登录:return:"""# 加载cookies文件if self._load_cookies():return True# 判断是否需要滑块验证self._user_check()st = self._apply_st()headers = {'Host': 'login.taobao.com','Connection': 'Keep-Alive','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}try:response = s.get(self.vst_url.format(st), headers=headers)response.raise_for_status()except Exception as e:print('st码登录请求,原因:')raise e# 登录成功,提取跳转淘宝用户主页urlmy_taobao_match = re.search(r'top.location.href = "(.*?)"', response.text)if my_taobao_match:print('登录淘宝成功,跳转链接:{}'.format(my_taobao_match.group(1)))self._serialization_cookies()return Trueelse:raise RuntimeError('登录失败!response:{}'.format(response.text))def _load_cookies(self):# 1、判断cookies序列化文件是否存在if not os.path.exists(COOKIES_FILE_PATH):return False# 2、加载cookiess.cookies = self._deserialization_cookies()# 3、判断cookies是否过期try:self.get_taobao_nick_name()except Exception as e:os.remove(COOKIES_FILE_PATH)print('cookies过期,删除cookies文件!')return Falseprint('加载淘宝登录cookies成功!!!')return Truedef _serialization_cookies(self):"""序列化cookies:return:"""cookies_dict = requests.utils.dict_from_cookiejar(s.cookies)with open(COOKIES_FILE_PATH, 'w+', encoding='utf-8') as file:json.dump(cookies_dict, file)print('保存cookies文件成功!')def _deserialization_cookies(self):"""反序列化cookies:return:"""with open(COOKIES_FILE_PATH, 'r+', encoding='utf-8') as file:cookies_dict = json.load(file)cookies = requests.utils.cookiejar_from_dict(cookies_dict)return cookiesdef get_taobao_nick_name(self):"""获取淘宝昵称:return: 淘宝昵称"""headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}try:response = s.get(self.my_taobao_url, headers=headers)response.raise_for_status()except Exception as e:print('获取淘宝主页请求失败!原因:')raise e# 提取淘宝昵称nick_name_match = re.search(r'<input id="mtb-nickname" type="hidden" value="(.*?)"/>', response.text)if nick_name_match:print('登录淘宝成功,你的用户名是:{}'.format(nick_name_match.group(1)))return nick_name_match.group(1)else:raise RuntimeError('获取淘宝昵称失败!response:{}'.format(response.text))if __name__ == '__main__':# 淘宝用户名username = '你的用户名'# 淘宝重要参数,从浏览器或抓包工具中复制,可重复使用ua = ua = '119#MlKma56msEckrMMzpwSCmgNzxbdQaRlcBPmaXIoz1usOCPPTlaAYXAvkIAl6Tg2dmQPTrKdo29CxyU/mLlGMarUsz9bGztA8RJBONt7J9CiLfBMKME3fx2Nqk/xMdGLWRU6O8t7M5x2omSgOwtNLfU+S4lkGdoHsRIVXNEFL9eAzMSTozSo8uJOqBtmOyaHCRSVJcF8L8xqzRBsUdA3q9U+SLgR+deF7yJShN8lL9dXzRPqLo+Y8q2vp499wde3lR2KVt9kLEhEzR/sU3AFh9UNltxhLSHr8y2SVNEH093ASRPSM2IRe9/sdLUq7+MMOqC9gSCqOfoerT6smYcVg5JqMfCr70SmjkQVwgE7l+3grCrjB6Sc4xGvCtyLxy197yTuyzTUCQL3ItdRejyQq8hPbRuvwxi68oUWwdilfcUAQc0yTRhWEcwDbcFvDFG+nYdPvylWaIOAGUlsrTKWdppT7iLVsNH/Fnh088EtTbL+pBSbjWj5Pa8/fnARp/MZ6BEmHE+mDR7RDvhJfdhNaxHrGadtaGmbVvHYo0oR6wWqiOkSfH2vD9TqEpp4amiEByxXMG+JMFNin+TFzA/FxLpIqGUzIO/vKtVv6jhy0GWosbEz1YHSkXkPM8m455opHcnWeKNtKQSUGtljeUW4da8T7SeEE1DZjeQBqZagX2CVkZqSMeTE5slss8IYeC0FL14tBih8cLP+zuAEikLq35Fv9e75A/p+Yp2Qb8PZoacMTxyhxOMvJZ64+RxSTQskuJx4GIbifdptOpIUdiwe+BSh3k9nq6WEEaP0eX6u9ZXoSLs7BoZtHJ74Mu2Au+q+zAHG4fUBGKdOvLb/7iwy3yXofRIUsKNFnADN/sezd4l0/aZfcFL9LicBF3SMKBJkgagHgzLkjZfOiWs68UtO0MAIHMSyI3zrG+QdZRehgbbjGYLlwzbfEzToF1aKi+2t8wdUORclDXthMsTTzb5bhCcJjwY/Ms8+0STdOUsC6paC9svXcF7pPxuTtGY/7IWM260DuzGDYe8Q9GU2zFrFVyiYXBjY3ZGmfgsuMP/iDswoO23eucC9dYHRoK0IMHHHDOFDMAA016r400YX6eg47FIVexIF1pNCzhZvXTnBCbDgTT6nvcokIWAyd0kVwH33Sgap4Z3rj5rQyaAVwsUpH2hjve0lBNasoMfOr/hUuyIS5DHodjsZCO+nKqRKEPUryHf7Ma9v5g5J46kF5lL0aJMf6kxJhcSvaNMa4dWVhsk3UyDPG5xdRZBO6e2OlimMoN7f8AbVfZF9LJrBiVSgDWgq1zBC/tNhg7Wm+aLf+VxbtAxr1CjtSt89mGdDCUr9LWftfHyncXh1ub6A2HRBcfah9M/Rru13An1WGWqOf8Xh7QSRdDn3fOEVl/SesmxJyDKkE61/Ri3h7h+W2n87nmgIaAIVg8ovsFIN0OZm6J2CyxgCjis2GuCLurnSCAFgiRsm9IP6PQLk5/3llWSrFmVoDDtfJD9P5apjuae5IqWfJWiMfvyEfTevqmufTTTS+w74lFv6OSHMK3yI5P0Z1/CYipvytIx+l8X6SHj19NizLJPWkMimJXAp4Fy3hebN85g5N7oYrjdDYonYrIo0eN1Ps6iCIz5dOCRPd0GIWpMSsFDx9IzVcwUzdU0Wfa+zmMpBsPHquxm/pJTkSV/KVEQf4cw7Q'# 加密后的密码,从浏览器或抓包工具中复制,可重复使用TPL_password2 = '8a65e84dbd099e3eb728bfbbbf6ecb2b759b50745120e186ad94b171e369dac0d877d0c816d49898ea166d2842469dcec0435e88d4f534ee502967eafd30976ca0424f9c4a65bfb8b27c1cd8cf68a3c94be4fb7bd4102095f34cfbfca2649eee9ac3ee3d2785789fc4de15279cfab6d6984c90ab557bb1ee83c187a4fd25698d'ul = UsernameLogin(username, ua, TPL_password2)ul.login()

Python模拟登录淘宝相关推荐

  1. Python学习教程:用Python模拟登录淘宝

    今天跟大家出的Python学习教程,Python模拟登录淘宝,我知道,肯定是吸引了你,一起来看看吧! 最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录 ...

  2. 手把手教你用Python模拟登录淘宝

    作者 | 猪哥66 来源 | 裸睡的猪(ID:IT--Pig) 最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章! 看了下网上有很多关于模拟 ...

  3. Python模拟登录淘宝都实现了,你还怕模拟登录?

    点击"简说Python",选择"置顶/星标公众号" 福利干货,第一时间送达! 本文授权转载自裸睡的猪,禁二次转载 作者:猪哥66 阅读文本大概需要 8 分钟. ...

  4. 手把手教你如何用Python模拟登录淘宝

    作者 |  猪哥66 来源 | 裸睡的猪(ID:IT--Pig) 最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章! 看了下网上有很多关于模 ...

  5. 手把手教你用Python模拟登录淘宝 !

    最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章! Python资源共享群:626017123 看了下网上有很多关于模拟登录淘宝,但是基本都 ...

  6. Python 模拟登录淘宝

    看了下网上有很多关于模拟登录淘宝,但是基本都是使用scrapy.pyppeteer.selenium等库来模拟登录,但是目前我们还没有讲到这些库,只讲了requests库,那我们今天就来使用reque ...

  7. python模拟登录淘宝_Python模拟登陆淘宝示例源码

    [实例简介] [实例截图] [核心代码] # -*- coding: utf-8 -*- import requests import re class TaoBao: def __init__(se ...

  8. Python爬虫实战(5):模拟登录淘宝并获取所有订单

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  9. Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 1. python模拟登录淘宝网页 2. 获取登录用户的 ...

  10. python淘宝爬虫登陆功能和下单功能_Python 爬虫实战5 模拟登录淘宝并获取所有订单...

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...

最新文章

  1. ACL 2018 收录论文 | 如何高效提炼有效信息?
  2. yara 模式匹配 android,YARA——恶意软件模式匹配利器
  3. omnipay支付--支付宝支付
  4. HttpMate简介
  5. java 批量打印_JAVA批量打印皕杰报表
  6. boost::filesystem::directory_iterator() 出现段错误 Sementation fault
  7. freemarker java静态方法_java Freemarker页面静态化实例详解
  8. 我做的第一个PHP网站
  9. 最新卡巴斯基密码管理器:注重便利性和强化密码控制
  10. oppok3如何刷机_oppok3怎么刷机
  11. PopClip 能让像苹果电脑像 iOS 一样选中文字后弹出搜索、复制、粘贴等选项
  12. 30【源码】数据可视化大屏:基于 Echarts + Python Flask 实现的32-9超宽大屏 - 中国国际疫情实时追踪
  13. 芭蕉河梯级水电站群监控系统
  14. [URL ]pixiv.net p站用户账号注销网页网址(电脑web版)
  15. HTML图片设置成为页面背景 ( 五个小步骤)
  16. 启动车子温车_车子启动后水温上的很快是什么原?
  17. 第三方接入支付宝授权登录(支付宝新建应用没有公钥和私钥)问题
  18. ARMv7 GICv2 GenericTimer 实战演练
  19. HTML——选择器(1)
  20. springboot 和 js (vue) 实现SM3加密 防篡改

热门文章

  1. Linux内核文件系统7
  2. Unity Shader 一 激光特效Shader
  3. uniapp的button按钮使用boder:none依然无法去掉黑色边框的解决。
  4. content-box和boder-box的区别
  5. 如何在同一台电脑上打开多个iPhone模拟器
  6. 【CDN学习笔记6】CDN回源到阿里云主机被拒绝的案例
  7. C++异常机制的实现方式和开销分析
  8. 小米路由器4C从0到自编译以及刷固件
  9. python连连看小游戏_python之自动化连连看脚本-第一关不动-小记
  10. 吸引力法则~助攻遇到自己的另一半