python 爬取淘宝第一弹(淘宝登录)

本文详细解析了使用Python爬虫技术实现淘宝网站自动化登录的过程,包括请求验证、密码验证及单点登录码(st码)的获取,为爬虫开发者提供实战指南。
该文章已生成可运行项目,

前言

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)

欢迎同学们交流,讨论,请大家继续关注接下来会出淘宝爬虫系列文章。请帮忙点点关注。谢谢大家,有不会的请在评论下方留言。有不对的地方欢迎大佬指教。

本文章已经生成可运行项目
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的黑蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值