当前位置: 首页 > 编程日记 > 正文

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

640?wx_fmt=png

作者 | 猪哥66

来源 | 裸睡的猪(ID:IT--Pig)


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


640?wx_fmt=jpeg


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


讲模拟登录淘宝之前,我们来回顾一下之前用 requests 库模拟登录豆瓣和新浪微博的过程:这一类模拟登录是比较简单的登录,只需要在请求登录时将用户名和密码上传验证通过就成功了,也就是说一步到位!


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


一、淘宝登录流程

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


640?wx_fmt=png

淘宝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.判断是否需要验证码

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


640?wx_fmt=png


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


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

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

举个例子:某台设备可能出现登录过大量的账号,这时候淘宝就可以从ua参数中获取设备号,然后对该设备进行限制!

知道了流程和请求链接及参数之后,我们就可以用代码来请求了!


640?wx_fmt=png


2.验证用户名密码

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


640?wx_fmt=png


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


640?wx_fmt=png


看看请求结果!


640?wx_fmt=png


可以看到申请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 码的原因就在于单点登录!


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


640?wx_fmt=png


4.使用 st 码登录

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


640?wx_fmt=png


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


5.获取淘宝昵称

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


640?wx_fmt=png


三、总结

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


1.代码结构

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


640?wx_fmt=png


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


2.存在问题

在写这篇教程之前猪哥也是先在网上了解,然后自己用浏览器和抓包工具(Charles)一步一步实践,最重要的是你先要了解淘宝登录的大概流程,不然你实际操作起来会一头雾水,下面就要讲讲目前遇到的问题和存在的问题吧.


  1. 首先第一个问题便是淘宝的滑块解锁,目前 requests 还没有很好的破解办法,后面介绍了一些爬虫框架之后我们再来破解吧!

  2. 猪哥尝试了很多次(50 次以上)登录退出都没出现过滑块验证码。

  3. 网上有人使用代理 ip,这里猪哥也没用,只要你不是超级超级超级频繁且大量爬取数据,一般大厂都不太会去封 ip,因为有误伤率和影响用户面太广,也许一封就是整个小区。

  4. 在第二步验证用户名和密码时,上传了近 30 个参数,如果你把username、ua、加密密码复制进去验证还是不通过可尝试把那 30 个参数换成你浏览器中的!

  5. 在第三步和第四步偶尔会出现一次错误,重试一下就可以!

  6. 文章有些关于淘宝登录框架纯属猪哥猜想,如有错误还望指正!


看到这里是不是感觉淘宝模拟登录就清晰明了很多了,感兴趣的同学可以收藏转发,周末有空自己尝试一下(源码:https://github.com/pig6/login_taobao)。征服淘宝登录,其他登录也就相对简单了!

(*本文为 AI 科技大本营转载文章,转载请联系原作者)

福利时刻



入群参与每周抽奖~

扫码添加小助手,回复:大会,加入福利群,参与抽奖送礼!

640?wx_fmt=jpeg

大会优惠票限时抢购中!此外,伯克利大学名师精髓课程移师北京。《动手学深度学习》作者、亚马逊首席科学家李沐线下亲授「深度学习实训营」,免费GPU资源,现场还将限量赠送价值85元的配套书籍一本,先到先得。原价1099元,限时专享CSDN 独家福利价199元识别海报二维码,即刻购票~

640?wx_fmt=jpeg

推荐阅读

  • 字节跳动李航:自学机器学习,研究AI三十载,他说AI发展或进入平缓期

  • 2019 AI ProCon日程出炉:Amazon首席科学家李沐亲授「深度学习

  • 读完ACL 2019录取的30篇知识图谱论文,我发现了这5点趋势

  • 如何用知识图谱挖掘商业数据背后的宝藏?

  • 腾讯AI开源框架Angel 3.0重磅发布:超50万行代码,打造全栈机器学习平台

  • 教你阅读CPython的源码

  • 安装Python/PyCharm,入门级爬虫案例 | Mac下玩转Python

  • Python冷知识,不一样的技巧带给你不一样的乐趣

  • 互联网人职业发展之路:三年升高工,七年做架构,十年送外卖

  • IT公司老板落水,各部门员工怎么救?

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

相关文章:

Python之机器学习K-means算法实现

一、前言: 今天在宿舍弄了一个下午的代码,总算还好,把这个东西算是熟悉了,还不算是力竭,只算是知道了怎么回事。今天就给大家分享一下我的代码。代码可以运行,运行的Python环境是Python3.6以上的版本&#…

C++中模板的使用

模板(Template)指C程序设计语言中的函数模板与类模板,是一种参数化类型机制。模板是C泛型编程中不可缺少的一部分。C templates enable you to define a family of functions or classes that can operate on different types of information.模板就是实现代码重用机…

php面试问答

结合实际PHP面试,汇总自己遇到的问题,以及网上其他人遇到的问题,尝试提供简洁准确的答案包含MySQL、Redis、Web、安全、网络协议、PHP、服务器、业务设计、线上故障、个人简历、自我介绍、离职原因、职业规划、准备问题等部分 GitHub: https:…

图解LSTM与GRU单元的各个公式和区别

作者 | Che_Hongshu来源 | AI蜗牛车 (ID: AI_For_Car)因为自己LSTM和GRU学的时间相隔很远,并且当时学的也有点小小的蒙圈,也因为最近一直在用lstm,gru等等,所以今天没事好好缕了一下,接下来跟着我一起区分并…

iphone越狱神器

前阵子刚刚换了iphone5,老婆的4就留给我了。一到手就决定越狱,无意中发现了一款越狱神器:爱思助手http://www.i4.cn/ 确实很好用转载于:https://blog.51cto.com/shanks/1306423

json11库的使用

JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式,易于让人阅读。同时也易于机器解析和生成。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON解析器和JSON库支持许…

覆盖10亿设备,月活2亿,快应用要取代App?

作者 | 伍杏玲 来源 | CSDN(ID:CSDNnews) 2017 年 1 月 9 日,微信小程序横空出世,紧接着支付宝小程序、百度智能小程序、今日头条小程序、12 大厂商联盟的快应用等布局小程序。自此,小程序迅速改变国内移…

跨域的四种方式

本文主要是关于跨域的几种方式,关于什么是跨域这里就不多说了,写这个也是为了记住一些知识点的。 一. jsonp jsonp的跨域方式很容易理解,页面的的每一个script标签浏览器都会发送get请求获取对应的文本资源,获取到了之后&#xff…

使用模式创建一个面向服务的组件中间件

引言 在本文中,您将了解面向服务的组件中间件在用于资源有限的语音设备时,在设计阶段所应用的模式。它涵盖了项目的问题上下文,并被看成是一组决定因素,是对相关体系结构远景的一个简要概括。您还会得到一份描述,其中介…

OpenCV代码提取:遍历指定目录下指定文件的实现

OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便。但是在最新的OpenCV 3.1版本给去除掉了。为了以后使用方便,这里将OpenCV 2.4.9中相关的函数给提取了出来,适合在Windows 64bits上使用。directory.hpp…

姚班三兄弟3万块创业八年,旷视终冲刺港股

作者 | 余洋洋 杨健楷编辑 | 张丽娟来源 | CV智识(ID:CVAI2019)旷视此次 IPO 或将成为整个 AI 行业的信号,不只是“ 四小龙”的另外三家——商汤、依图、云从,整个 AI 行业的创业公司都将受到影响。8月25日晚,AI 独角兽…

Java类加载器详解

Java虚拟机中的类加载有三大步骤:,链接,初始化.其中加载是指查找字节流(也就是由Java编译器生成的class文件)并据此创建类的过程,这中间我们需要借助类加载器来查找字节流. Java虚拟…

linux svn客户端的使用

一下内容转载于:http://blog.chinaunix.net/space.php?uid22976768&doblog&id1640924。这个总结的很好~ windows下的TortoiseSVN是资源管理器的一个插件,以覆盖图标表示文件状态,几乎所以命令都有图形界面支持,比较好用&…

C++中vector的使用

向量std::vector是一种对象实体,能够容纳许多各种类型相同的元素,包括用户自定义的类,因此又被称为序列容器。与string相同,vector同属于STL(Standard Template Library)中的一种自定义的数据类型,可以广义上认为是数组…

说出来你可能不信,现在酒厂都在招算法工程师

导语:虽然夏日已过,但人们喝啤酒的热情还在持续高涨。不过随着大众的追求和理念提升,对于啤酒的要求也越来越高,比如逐渐兴起的精酿之风,都在印证人们在啤酒的口感和风味上,拥有更加「苛刻」的要求。那么这…

「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化ES6 中箭头函数的用法this 的原理以及用法伪类与伪元素的区别及实战如何实现一个圣杯布局?今日头条 面试题和思路解析最近&#xff0c…

安装Ecshop首页出现报错:Only variables should be passed by referen

出现下面这就话: Strict Standards: Only variables should be passed by reference in D:\wamp\ecshop\includes\cls_template.php on line 406 第406行:$tag_sel array_shift(explode( , $tag)); 解决办法 1 5.3以上版本的问题,应该也和配…

KDD 2019高维稀疏数据上的深度学习Workshop论文汇总

作者 | 深度传送门来源 | 深度传送门【导读】本文是“深度推荐系统”专栏的第九篇文章,这个系列将介绍在深度学习的强力驱动下,给推荐系统工业界所带来的最前沿的变化。本文简要总结一下阿里妈妈在 KDD 2019 上组织的第一届面向高维稀疏数据的深度学习实…

C++中fstream的使用

C中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将…

浅谈Disruptor

Disruptor是一个低延迟(low-latency),高吞吐量(high-throughput)的事件发布订阅框架。通过Disruptor,可以在一个JVM中发布事件,和订阅事件。相对于Java中的阻塞队列(ArrayBlockingQueue,LinkedBlockingQueue),Disruptor的优点是性…

web 服务发布注意事项

1、在发布的时候首先查看服务器对外开放的端口,如果没有最好和客户进行沟通需要开放那些对应的端口,要不外界无法访问发布的站点。 2、在oracle需要远程控制服务器的数据库的时候需要开发1521端口。转载于:https://www.cnblogs.com/jzm53550629/p/337563…

OpenCV代码提取:resize函数的实现

之前在http://blog.csdn.net/fengbingchun/article/details/17335477 中有过对cv::resize函数五种插值算法的介绍。这里将OpenCV3.1中五种插值算法的代码进行了提取调整。支持N通道uchar和float类型。经测试,与OpenCV3.1结果完全一致。实现代码resize.hpp&#xff1…

IBM重磅开源Power芯片指令集?国产芯迎来新机遇?

整理 | 郭芮出品 | CSDN(ID:CSDNnews)自去年 IBM 以 340 亿美元收购了 Linux 巨头红帽之后,这家 107 岁的蓝色巨人终于又在开源方面有大动作了!近日在 Linux 基金会开源峰会上,IBM 宣布向开源社区提供 Powe…

构造函数不能为虚/重载函数总结

构造函数不能为虚/重载函数总结 作为一个类,他最基础的成员函数就要数构造函数了。这里我们先探讨一下构造函数为什么不能是虚函数。 在解决这个问题之前,要先明白类中函数的调用方式。一个类的函数共用一个函数空间,因此在实例化的对象中是不…

通过data:image/png;base64把图片直接写在src里

2019独角兽企业重金招聘Python工程师标准>>> 关于用base64存储图片 网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如:data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZS…

算力“竞速”,企业AI落地的当务之急

充足的算力资源,在数据量持续增长及算法持续复杂化的前提下,无疑是保障人工智能应用落地效果的关键。软件定义算力——打造AI转型最佳实践8月2日,第四范式联合英特尔共同举办了AI实践者之声夏令营活动。第四范式基础架构负责人刘一鸣以《软件…

内存检测工具Dr. Memory的使用

Dr. Memory是一个内存调试工具,它是一个开源免费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问、内存非法访问、数组越界读/写、以及内存泄露等。它可以在Linux、Windows、Mac OS和Android操作系统上使用。关于Dr. Memo…

手把手教你如何新建scrapy爬虫框架的第一个项目(下)

前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章页为例进行说明。在我们创建好Scrapy爬虫项目之后,会得到上图…

.net完整的图文验证

摘自:http://blog.csdn.net/durongjian/article/details/4336380 一、创建ValidaeCode类库工程: 1、创建ValidaeCode类库工程,在[解决胜方案资源管理器]面板中,右键单击[ValidateCode]节点,并选择[属性]命令。 2、单击[属性]命令&…

Tesseract-OCR 3.04在Windows7 vs2013上编译过程

从https://github.com/tesseract-ocr/tesseract下载最新源码,commit id: 86acff5, 2016.06.07. 里面有个vs2010目录,用vs2013打开tesseract.sln。Tesseract依赖图像库Leptonica,Leptonica的编译过程可以参考http://blog.csdn.net/fengbingchun/article/d…