最近想爬取淘宝的一些商品, 但是发现如果要使用搜索等一些功能时基本都需要登录, 所以就想出一篇模拟登录淘宝的文章!
看了下网上有很多关于模拟登录淘宝, 但是基本都是使用 scrapy,pyppeteer,selenium 等库来模拟登录, 但是目前我们还没有讲到这些库, 只讲了 requests 库, 那我们今天就来使用 requests 库模拟登录淘宝!
讲模拟登录淘宝之前, 我们来回顾一下之前用 requests 库模拟登录豆瓣和新浪微博的过程: 这一类模拟登录是比较简单的登录, 只需要在请求登录时将用户名和密码上传验证通过就成功了, 也就是说一步到位!
而淘宝登录就比较复杂, 为什么说复杂呢? 因为淘宝登录涉及参数多且请求不止一次! 我们就先来讲讲淘宝登录的流程, 先把流程原理搞懂, 再去敲代码, 这样大家就容易理解!
一, 淘宝登录流程
为了便于大家理解, 猪哥画了一个非标准的淘宝登录请求时序图
淘宝 ua 参数: ua(User-Agent)故名用户代理, 淘宝的 ua 参数加入了浏览器, ip, 电脑, 时间等信息, 然后加密生成, 在很多地方使用, 不仅仅是登录!
上图是比较详细的流程图, 从代码层面考虑猪哥将模拟登录淘宝分为以下四个步骤:
输入用户名后, 浏览器会向淘宝 (taobao.com) 发起一个 post 的请求, 判断是否出现滑块验证!
用户输入密码后, 浏览器向淘宝 (taobao.com) 又发起一个 post 请求, 验证用户名密码是否正确, 如果正确则返回一个 token.
浏览器拿着 token 去阿里巴巴 (alibaba.com) 交换 st 码!
浏览器获取 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. 代码结构
来放出一张代码结构图, 让大家直观了解
这就是我们前面说过的模拟登录淘宝的四个步骤, 不过这里我们是用代码实现了!
2. 存在问题
在写这篇教程之前猪哥也是先在网上了解, 然后自己用浏览器和抓包工具 (Charles) 一步一步实践, 最重要的是你先要了解淘宝登录的大概流程, 不然你实际操作起来会一头雾水, 下面就要讲讲目前遇到的问题和存在的问题吧
首先第一个问题便是淘宝的滑块解锁, 目前 requests 还没有很好的破解办法, 后面介绍了一些爬虫框架之后我们再来破解吧!
猪哥尝试了很多次 (50 次以上) 登录退出都没出现过滑块验证码.
网上有人使用代理 ip, 这里猪哥也没用, 只要你不是超级超级超级频繁且大量爬取数据, 一般大厂都不太会去封 ip, 因为有误伤率和影响用户面太广, 也许一封就是整个小区.
在第二步验证用户名和密码时, 上传了近 30 个参数, 如果你把 username,ua, 加密密码复制进去验证还是不通过可尝试把那 30 个参数换成你浏览器中的!
在第三步和第四步偶尔会出现一次错误, 重试一下就可以!
看到这里是不是感觉淘宝模拟登录就清晰明了很多了, 感兴趣的同学可以收藏转发, 周末有空自己尝试一下. 征服淘宝登录, 其他登录也就相对简单了!
来源: https://www.cnblogs.com/pig66/p/11363220.html