• 京东商城自动签到领京豆


    一.介绍

    PhantomJS是一个基于WebKit的JavaScript API,它使用QtWebKit作为它核心浏览器的功能,使用WebKit来编译解释执行JavaScript代码,任何你可以在基于WebKit浏览器做的事情,它都能做到。Selenium是一个用于Web应用自动化程序测试的工具,可以让浏览器自动加载页面,获取需要的数据,Selenium自己不带浏览器,所以需要和PhantomJS、FireFox、Chrome等浏览器结合

    二.登录流程

    1.切换登录方式

    查找claaa=div.login-tab.login-tab-r的元素,发送click事件,class标签在selenium中需要使用"元素类型.class1.class2"把空格进行替换。

    2.输入用户名密码并登录

    查找id=loginname的元素,调用send_keys输入用户名;查找id=nloginpwd的元素,调用send_keys输入密码;查找id=loginsubmit的元素,发送click事件。

    3.用户签到

    打开http://vip.jd.com/home.html页面,查找id=signIn的元素,发送click事件。

    4.店内签到

    打开https://bean.jd.com/myJingBean/list页面,使用xpath查找//ul[@class='bean-shop-list']/li/a[@class='s-btn']元素,查找href属性,并打开页面;在新打开的页面中查找class=a.d-header-icon.unsigned的元素,并发送click事件。

    三.完整代码

    新建jd.py文件

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from selenium import webdriver
    import time
    import sys
    import io
    
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
    
    # 点击页面元素
    def my_click(browser, type, value):
        if type == "id":
            element = browser.find_element_by_id(value)
        elif type == "name":
            element = browser.find_element_by_name(value)
        elif type == "class":
            element = browser.find_element_by_css_selector(value)
        else:
            print("Can't find element")
            return
        element.click()
        time.sleep(3)
    
    # 用户签到
    def my_login(browser):
        browser.get("https://passport.jd.com/uc/login")
        time.sleep(3)
        my_click(browser, "class", "div.login-tab.login-tab-r")
    
        loginname = browser.find_element_by_id("loginname")
        nloginpwd = browser.find_element_by_id("nloginpwd")
        loginname.send_keys("username")
        nloginpwd.send_keys("password")
    
        my_click(browser, "id", "loginsubmit")
        print("login success")
        time.sleep(3)
    
        # 把页面保存为图片,验证是否登录成功
        browser.get_screenshot_as_file("login.png")
    
    # 店内签到
    def shop_sign_in(browser):
        print("店内签到")
        browser.get("https://bean.jd.com/myJingBean/list")
        time.sleep(3)
        shops = browser.find_elements_by_xpath("//ul[@class='bean-shop-list']/li/a[@class='s-btn']")
        urls = [s.get_attribute("href") for s in shops]
        for url in urls:
            try:
                browser.get(url)
                time.sleep(3)
                my_click(browser, "class", "a.d-header-icon.unsigned")
                print("%s 签到成功" % url)
            except:
                print("%s 签到失败" % url)
    
    # 用户登录
    def user_sign_in(driver):
        print("用户签到")
        url = "http://vip.jd.com/home.html"
        driver.get(url)
        time.sleep(3)
        my_click(driver, "id", "signIn")
        print("%s 签到成功" % url)
    
    def main():
        browser = webdriver.PhantomJS(executable_path=r"/root/phantomjs-2.1.1-linux-x86_64/bin/phantomjs")
        # 最大化浏览器窗口
        browser.maximize_window()
    
        my_login(browser)
        user_sign_in(browser)
        shop_sign_in(browser)
    
        browser.quit()
    
    if __name__ == "__main__":
        main()

    四.验证程序

    环境:Python(3.5.2)

    1.下载Phantomjs

    地址http://phantomjs.org/download.html

    2.运行脚本

    root@710bd3e4deb6:~# python3 jd.py 

    3.登录https://bean.jd.com/myJingBean/list查看是否签到成功

    五.异常处理

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

    输出字符编码格式错误,修改编码格式

    import sys
    import io
    
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
  • 相关阅读:
    发光二极管
    续流二极管作用及工作原理
    python backtrace注意事项
    docker tips
    direct stdin and stdout
    python skill
    mysql comments
    python dict
    python list and tuple
    Python library
  • 原文地址:https://www.cnblogs.com/faramita2016/p/7782659.html
Copyright © 2020-2023  润新知