前言
2018年7月份,当时我正在学习爬虫,看过一个教程视频是用selenium爬取淘宝,当时因为种种原因(当然还是因为自己太lan)没有去写,但当11月份想找工作时,想找一个爬虫练手,能够写上简历充当项目,当我在去看视频的时候学习的时候,当时自信满满的写完代码,竟然没有登录不能进行搜索!!!好吧那我就做一个滑块功能吧,写完了代码,不知道为何划过去不好使,但是我自己手动滑动滑块完全ok,当时就蒙了,由于当时是淘宝刚刚更新,网上并没有教程,无奈之下只能转战某东。
时隔一年,我又回来啦,现在的淘宝爬取商品,都是收费的,网上我看了一眼并没有看到能够真正爬取淘宝的教程,所以我在看到一个大佬的教程之后,想着记录一下,并且期待有缘人,能够共同探讨共同进步。话不多说马上开始。
淘宝会有很多登陆的流程,我也是一头蒙,看了大佬的讲解之后才有点明白,在此记录一下。
首先在你打开淘宝鼠标点击用户名那栏的时候,淘宝会出现一个post请求验证,用来是否验证出现滑块,然后在你输入密码的时候,浏览器向淘宝发起一个post请求,验证用户名密码是否正确,如果正确就会返回一个token信息,再然后呢浏览器会拿着token去“alibaba.com“交换st信息,最后拿到st后获取到cookie登录成功。
首先我们看一下登录页面


可以看到的是在输入账号的时候浏览器就会发起一个post请求,来验证是否需要出现滑块验证码,如果返回true,滑块验证码出现,不过一搬的时候不会出现。
图上可以看到有两个参数 ua 和 username
我们可以去开始编写代码了

接下来验证用户名密码

找到login这个从里面将headers和form信息拿下来,然后去请求token
def password_(self):
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 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'content-type': 'application/x-www-form-urlencoded',
'referer': 'https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F',
}
#登录淘宝提交的数据,登录失败,可重新复制form data
verify_password_data={
'TPL_username': self.username,
'ncoToken': 'b092c9650a75f3fd9d66cf71a56e3b04fc9415fc',
'slideCodeShow': 'false',
'useMobile': 'false',
'lang': 'zh_CN',
'loginsite': 0,
'newlogin': 0,
'TPL_redirect_url': ' https://www.taobao.com/',
'from': 'tbTop',
'fc': ' default',
'style': 'default',
'keyLogin': 'false',
'qrLogin': 'true',
'newMini': 'false',
'newMini2': 'false',
'loginType': '3',
'gvfdcname': '10',
'gvfdcre': '68747470733A2F2F7777772E74616F62616F2E636F6D2F',
'TPL_password_2': self.pasword,
'loginASR': '1',
'loginASRSuc': '1',
'oslanguage': ' zh-CN',
'sr': '1920*1080',
'osVer': 'windows|6.1',
'naviVer': 'chrome|76.038091',
'osACN': 'Mozilla',
'osAV': '5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'osPF': 'Win32',
'appkey': '00000000',
'mobileLoginLink': 'https://login.taobao.com/member/login.jhtml?spm=a21bo.2017.754894437.1.5af911d9dyqqjX&f=top&redirectURL=https://www.taobao.com/&useMobile=true',
'um_token': 'TDD8618838C054AB415A3B467C0F42E64B5076050F52B00A1E1A598C36F',
'ua': self.ua
}
try:
response = s.post(self.yanzheng_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码url
apply_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('用户名密码验证失败:{}'.format(response.text))
接下来就是去获取st码然后去获取登录链接,具体st是什么在这里不过多解释(具体我也不是很懂,看大佬文章了解到)但是st码是单点登录码,想了解的同学可以去问度娘。

获取到登录链接,就可以登录成功。
下面是完整代码,本代码只做学习用途,不得商用。
import requests
import re
import os
import json
s=requests.Session()
class Taobaologin:
def __init__(self,username,ua,pasword):
#用来检测是否需要验证码的url
self.yanzhengma_url='https://login.taobao.com/member/requestyanzhengma_.do?_input_charset=utf-8'
# 用来验证淘宝用户名密码的url
self.yanzheng_password_url = "https://login.taobao.com/member/login.jhtml"
# 访问st码的url
self.st_href='https://login.taobao.com/member/vst.htm?st={}'
self.username=username
self.ua=ua
self.pasword=pasword
self.timeout=9
def yanzhengma_(self):
"""
检测账号是否需要验证码
:param self:
:return:
"""
data={
'username':self.username,
'ua':self.ua
}
try:
resp=s.post(self.yanzhengma_url,data=data,timeout=self.timeout)
except Exception as e:
print("检测是否需要验证码请求失败的原因:{}".format(e))
return True
needcode=resp.json()['needcode']
print('是否需要滑块验证:%s'%' 是'if needcode else '否')
return needcode
def password_(self):
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 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'content-type': 'application/x-www-form-urlencoded',
'referer': 'https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F',
}
#登录淘宝提交的数据,登录失败,可重新复制form data
verify_password_data={
'TPL_username': self.username,
'ncoToken': 'b092c9650a75f3fd9d66cf71a56e3b04fc9415fc',
'slideCodeShow': 'false',
'useMobile': 'false',
'lang': 'zh_CN',
'loginsite': 0,
'newlogin': 0,
'TPL_redirect_url': ' https://www.taobao.com/',
'from': 'tbTop',
'fc': ' default',
'style': 'default',
'keyLogin': 'false',
'qrLogin': 'true',
'newMini': 'false',
'newMini2': 'false',
'loginType': '3',
'gvfdcname': '10',
'gvfdcre': '68747470733A2F2F7777772E74616F62616F2E636F6D2F',
'TPL_password_2': self.pasword,
'loginASR': '1',
'loginASRSuc': '1',
'oslanguage': ' zh-CN',
'sr': '1920*1080',
'osVer': 'windows|6.1',
'naviVer': 'chrome|76.038091',
'osACN': 'Mozilla',
'osAV': '5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'osPF': 'Win32',
'appkey': '00000000',
'mobileLoginLink': 'https://login.taobao.com/member/login.jhtml?spm=a21bo.2017.754894437.1.5af911d9dyqqjX&f=top&redirectURL=https://www.taobao.com/&useMobile=true',
'um_token': 'TDD8618838C054AB415A3B467C0F42E64B5076050F52B00A1E1A598C36F',
'ua': self.ua
}
try:
response = s.post(self.yanzheng_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码url
apply_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码
:return:
"""
apply_st_url=self.password_()
try:
st_resp=s.get(apply_st_url)
except Exception as e:
print("申请st码请求失败,原因")
raise e
st_match=re.search(r'"data":{"st":"(.*?)"}',st_resp.text)
if st_match:
print('获取st码成功,st码:{}'.format(st_match.group(1)))
return st_match.group(1)
else:
raise RuntimeError("获取st码失败! ")
def login(self):
"""
使用st码登录
:return:
"""
self.yanzhengma_()
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.st_href.format(st), headers=headers)
response.raise_for_status()
except Exception as e:
print('st码登录请求,原因:')
raise e
# 登录成功,提取跳转淘宝主页链接
my_taobao_match = re.search(r'top.location.href = "(.*?)"', response.text)
if my_taobao_match:
print('登录淘宝成功,跳转链接:{}'.format(my_taobao_match.group(1)))
return my_taobao_match.group(1)
else:
raise RuntimeError('登录失败!response:{}'.format(response.text))
if __name__ == '__main__':
# 淘宝用户名
username = ''
ua = '121#sQylk/WnoWwlVlhpxVH0llXYecEfKujV9lbiqG/5oO74L2huFID5lwLYAcFfKujVllgm+aVGT2cvA3rnE9jIlwXYLa+xNvo9lGuYZ7pIKM9STQrJEmD5lwLYAcfdK5jVVmgY+zP5KMlVA3rnEkD5bwLYOcMYtutT0MQVBIbvsbc9MtFPD0rOa3VbbZ3glWfopCibkZ0T83Smbgi0CeIAFt7j+q9JnjxSpqLbCZeTM35O3piDkeHXmo60bZienqC9pCibCZ0T83BhbZs0keHaF9FbbZsbnjxSpXsbMqAT8dBLbgi0CvIPC9pIl/E0lnhdRtsbC6748u/milwAzvnyt5c5/FL2qSj+WB3OxUrYwyvUXKqnn/Tr9OKbQAvinzq3lEA9IZqAhMo0ayFsVOKKljj89RH9lJnkMjcZitjb8u+jB/Vg6oF41AWjD10S1PIxWStDOPtWfU0dRXLsCBIEWulD47txhxCh6CgY/JrDRsB9AKdPGv9qIbW7vuH1/VL0YmNvE3m6D6gh4288XuQ/PAuGRVJsmjZ16LV6ah9aUqZS2lA78FleH0bEIW8rdoaHTgLpouJ3xaA/3NApoLrQu4eR3UBDhcSRg65ffeCMJQAF15pNbuZEv4PosB7P7P30cWb+jIKIxVq1YGVM94pio7ZrVXNBZ6GXsOBPWThzAWwzMyPnWylXpsF990cqFT9riyOJpcEZtugpcexwIFoZKVVPYZHcBI/i4KxLlFF8o1Ps0cgkITdEjLx4RFyhS+S4cwAWRp7ycdJY4rDqBx+/L/rKeiF+M+o+D2bFwwaPE2FctGrk9d+j+L3jqtdif64Q/Gts1M/0ULi6whLBI1MBJTNWT4PhlMxvAR5KDFX5dPxlK6mX8NmwxVuDBXvswizvIAMzzUaz+yWKigITawfjWcWebLMa2QnIFmCraOzQkFM5bWe3mFLdxT2sMkoF9SK5eMOuv+bXCJd4jcG4TxHgN55dzdNS2YLVIn8/Q+Fu3ggrTaeojGf3ms7WaJjWi1hWJCuOKYcaknkJPrEVfjXpswX6iFmW5ZEaurIohzxddb+NxD5mFQzf/b6ZtIRypdzxzS0MFUL0yXThW6MSwTLDDJyCFkfxxUdT4r6uUW9XL1si5CEKMBX5AJGH00rZc3t='
pasword = '403f4b8f8b9bce8d014bc030d87928a6937248fa3e604e2101dc546e24955d89142f8f223f313da3541c1d93d5f2797dc85feedd273c7063f1faf3e01e8216c12d805b09d278a78e2463038cf7a380402c4cf7d021d737bb776a25f7269c76bb31c08b8650dc6a025182ccc66e7d4e6bf63744eae82c1a57bb9ebe62dde21f37'
ul = Taobaologin(username, ua, pasword)
欢迎同学们交流,讨论,请大家继续关注接下来会出淘宝爬虫系列文章。请帮忙点点关注。谢谢大家,有不会的请在评论下方留言。有不对的地方欢迎大佬指教。
本文详细解析了使用Python爬虫技术实现淘宝网站自动化登录的过程,包括请求验证、密码验证及单点登录码(st码)的获取,为爬虫开发者提供实战指南。
3177





