京東商城自動簽到領京豆


一.介紹

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')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM