零基础带你用python模拟淘宝登录

经过一段时间的学习,并参考各路大神的文章,总结出一些比较适合小白的网络爬虫的小技巧。跟着笔者的思路,循序渐进,可以慢慢找到一点小感觉。

开发环境

笔者选用的是vs code,轻量级,支持各种插件安装。

  • 首先进入官网,下载python安装包,这里有一点要注意:默认下载是64位的python,建议从以下入口进入:
    在这里插入图片描述
    点击进入后,拉到最下面,可以选择64/32位的python安装。安装的时候,要勾选Add Python x.x.x To Path(可省去手动配置环境变量),然后一路默认安装即可。
  • 去官网下载vs-code,一路默认安装即可。
  • 在vs-code中搜索python,选择第一项,安装python模块。

配置环境和依赖项

安装第三方库

pyhon之所以受欢迎,得益于它的高效,简而言之,就是借助大量的第三方库。而且,很多强大的功能库,都提供支持python的api接口。

  • 在cmd下执行pip install selenium,selenium是一款WEB自动化工具,主要用于网络爬虫、模拟登录等。
  • 在cmd下执行pip install pyautogui,pyautogui有点类似于按键精灵,主要用于模拟人操作鼠标和键盘,可完美破解一些大型网站会有反爬机制。
  • 在cmd下执行pip install pylint,pylint主要用于发现并分析编码中的错误。
  • 在cmd下执行pip install flake8,flake8主要用于规范python编码格式。
  • 在cmd下执行pip install PyExecJS,PyExecJS用于解析js格式文件,可用来清洗数据;

配置VS-CODE

  1. 设置tab 4字节缩进
  • File - Preferences - Setting(快捷键:Ctrl+,),选择user选项卡
  • 打开json文件,在}之前添加代码(保存好设置,重启vs code即可生效):
"editor.detectIndentation": false,
"editor.tabSize": 4, //vscode设置的缩进量
"editor.formatOnSave": false, //保存时候自动格式化,不建议设置。我在这里设置为false
  1. 在vs code中配置pylint和flake8
  • File - Preferences - Setting(快捷键:Ctrl+,),选择Worksapce选项卡
  • 打开json文件,添加如下代码(保存即可,不用重启):
{
    "python.linting.flake8Enabled": true,
    "python.formatting.provider": "yapf",
    "python.linting.flake8Args": ["--max-line-length=248"],
    "python.linting.pylintEnabled": false
}
  1. 将按两次F5运行,改为按一次
  • 切换到Run选项卡,添加配置,打开lanuch.json,添加如下代码:
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: 当前文件",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "stopOnEntry": false
        }
    ]
}

安装WebDriver

基础学习

在学习过程中参考了很多好的资料,在此分享给大家。

模拟淘宝登录

  1. 打开淘宝网
from selenium import webdriver
from time import sleep


# 定义一个淘宝类
class TaoBao(object):
    def __init__(self):
        self.browser = webdriver.Chrome()
        self.domain = 'http://www.taobao.com'

    def open(self):
        self.browser.get(self.domain)
        sleep(3)


# main函数入口
if __name__ == "__main__":
    tb = TaoBao()
    tb.open()

  1. 元素定位
    按F12进入控制台,定位到账号密码输入框的位置
    在这里插入图片描述

用selenium定义元素的api,这里推荐三个,其中find_element_by_xpath最常用

# 获取账号编辑框,此处id和name一致纯属巧合
self.browser.find_element_by_id('fm-login-id')
self.browser.find_element_by_name('fm-login-id')
self.browser.find_element_by_xpath('//*[@id="fm-login-id"]')

为什么说通过xpath获取最常用呢,因为xpath是精准定位,且能直接拷贝获得。
在这里插入图片描述
定位其它网页元素,方法类似,不再赘述。

  1. 滑块验证
    前面有提到过,selenium可以模拟用户点击。
# 找到滑块位置
slider = self.browser.find_element_by_xpath("//span[contains(@class, 'btn_slide')]")
if slider.is_displayed():
    # 拖拽滑块
    self.action_chains.drag_and_drop_by_offset(slider, 258, 0).perform()
    time.sleep(0.5)
    # 释放滑块,相当于点击拖拽之后的释放鼠标
    self.action_chains.release().perform()
  1. pyautogui模拟人工点击
    前面有提到过,淘宝有反爬机制,能检测到selenium的模拟点击,会导致登录失败。那么,我们就借助pyautogui模拟人工点击。
  • 首先,用截图工具截图登录按钮的图片(最好用电脑自带的)在这里插入图片描述
  • pyautogui可以根据这张图片,找到登录按钮的位置,从而操作鼠标去点击
 coords = pyautogui.locateOnScreen('1.png')
 x, y = pyautogui.center(coords)
 pyautogui.leftClick(x, y)
  1. 登录结果校验
    点击登录按钮后,我们并不能直观的判断是否登录成功。此时,我们可以再次打开淘宝页面,查看用户名是否存在。
  • 找到用户名的显示位置
    在这里插入图片描述
  • 获取用户名,因为site-nav-user不一定存在,故需要用try处理异常
def get_nickname(self):
    self.browser.get(self.domain)
    time.sleep(0.5)
    try:
        return self.browser.find_element_by_class_name('site-nav-user').text
    except NoSuchElementException:
        return ''
  1. 最终代码
from selenium import webdriver
from time import sleep
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import WebDriverException
from selenium.webdriver import ActionChains
import pyautogui
import pymsgbox
pyautogui.PAUSE = 0.5


# 定义一个淘宝类
class TaoBao(object):
    def __init__(self):
        self.browser = webdriver.Chrome()
        self.domain = 'http://www.taobao.com'
        self.browser.maximize_window()  # 窗口最大化
        self.browser.implicitly_wait(5)

    def open(self):
        self.browser.get(self.domain)
        sleep(1)

    def login(self, usrname, passwd):

        self.browser.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click()  # 点击登录按钮
        self.browser.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys(usrname)  # 输入账号
        self.browser.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys(passwd)  # 输入密码

        # 若出现滑块,需要模拟滑动
        sleep(1)
        try:
            # 出现验证码,滑动验证
            slider = self.browser.find_element_by_xpath("//span[contains(@class, 'btn_slide')]")
            if slider.is_displayed():
                # 拖拽滑块
                ActionChains(self.browser).drag_and_drop_by_offset(slider, 258, 0).perform()
                sleep(0.5)
                # 释放滑块,相当于点击拖拽之后的释放鼠标
                ActionChains(self.browser).release().perform()
        except (NoSuchElementException, WebDriverException):
            pass

        # 模拟人工点击
        try:
            coords = pyautogui.locateOnScreen('1.png')
            x, y = pyautogui.center(coords)
            pyautogui.leftClick(x, y)
        except TypeError:
            pymsgbox.alert('未找到登录按钮')

        # 验证登录结果
        nickname = self.get_nickname()
        if nickname:
            pymsgbox.alert('登录成功,呢称为:' + nickname)

    def get_nickname(self):
        self.browser.get(self.domain)
        sleep(0.5)
        try:
            return self.browser.find_element_by_class_name('site-nav-user').text
        except NoSuchElementException:
            return ''


# main函数入口
if __name__ == "__main__":
    tb = TaoBao()
    tb.open()
    usrname = 'lgtxxxxxx'
    passwd = 'xxxxxx'
    tb.login(usrname, passwd)

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值