溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

用Python實(shí)現(xiàn)自動(dòng)簽到的方法

發(fā)布時(shí)間:2020-06-24 16:00:00 來(lái)源:億速云 閱讀:1389 作者:清晨 欄目:編程語(yǔ)言

這篇文章主要介紹用Python實(shí)現(xiàn)自動(dòng)簽到的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

用爬蟲來(lái)實(shí)現(xiàn)自動(dòng)簽到算是爬蟲里一種比較簡(jiǎn)單的應(yīng)用,但不妨礙它很實(shí)用。

有哪些應(yīng)用場(chǎng)景

自動(dòng)簽到的應(yīng)用場(chǎng)景非常多,比如貼吧簽到、論壇簽到、網(wǎng)站打卡,甚至于我接下來(lái)會(huì)使用到的應(yīng)用場(chǎng)景:健身房打卡。

由于疫情影響,我平常去的那家健身房停業(yè)了近3個(gè)月,于是推出了一個(gè)算是比較苛刻的補(bǔ)償措施或者說(shuō)是活動(dòng),連續(xù)在網(wǎng)站打卡4個(gè)月可以額外贈(zèng)送4個(gè)月時(shí)長(zhǎng)。

也算是過(guò)濾一下平常就不怎么去健身的人吧,但是對(duì)大部分經(jīng)常去的人就很不友好,本來(lái)就忙還得天天惦記著給他打卡。作為一只程序猿能讓這點(diǎn)小事難住了?

什么是selenium

selenium 是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。

支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。selenium 是一套完整的web應(yīng)用程序測(cè)試系統(tǒng),包含了測(cè)試的錄制(selenium IDE),編寫及運(yùn)行(Selenium Remote Control)和測(cè)試的并行處理(Selenium Grid)。

selenium可以模擬真實(shí)瀏覽器,自動(dòng)化測(cè)試工具,支持多種瀏覽器,爬蟲中主要用來(lái)解決JavaScript渲染問(wèn)題

簡(jiǎn)單來(lái)說(shuō),selenium是一個(gè)可以讓你用代碼來(lái)模擬操作瀏覽器的工具。先附上一段代碼體驗(yàn)一下

from selenium import webdriver#導(dǎo)入庫(kù)
browser = webdriver.Chrome()#聲明瀏覽器
url = 'https:www.baidu.com'
browser.get(url)#打開瀏覽器預(yù)設(shè)網(wǎng)址
print(browser.page_source)#打印網(wǎng)頁(yè)源代碼
browser.close()#關(guān)閉瀏覽器

上述代碼運(yùn)行后,會(huì)自動(dòng)打開Chrome瀏覽器,并登陸百度打印百度首頁(yè)的源代碼,然后關(guān)閉瀏覽器。是不是簡(jiǎn)單明了。

安裝也非常簡(jiǎn)單,跟安裝其他Python庫(kù)一樣

pip install selenium

網(wǎng)頁(yè)分析

寫爬蟲避不開的一步就是分析頁(yè)面,先附上要爬的網(wǎng)頁(yè)鏈接

這是一個(gè)手機(jī)端的web頁(yè)面,并沒(méi)有做針對(duì)電腦端的優(yōu)化,這也是我首先會(huì)選擇用selenium實(shí)現(xiàn)的其中一個(gè)原因。

1、首先就是網(wǎng)頁(yè)登錄

用Python實(shí)現(xiàn)自動(dòng)簽到的方法

兩個(gè)輸入框加一個(gè)按鈕總共三行代碼就能搞定

    # 這里是找到輸入框,發(fā)送要輸入的用戶名和密碼,模擬登陸
    browser.find_element_by_xpath('//*[@id="login_box"]/ul/li[1]/div/input').send_keys(username)
    browser.find_element_by_xpath('//*[@id="login_box"]/ul/li[2]/div/input').send_keys(password)
    # 在輸入用戶名和密碼之后,點(diǎn)擊登陸按鈕
    browser.find_element_by_xpath('//*[@id="login_box"]/div[2]/button[1]').click()

我用的是xpath的方式定位頁(yè)面元素,除此之外selenium支持很多種方式定位元素,比如

  browser.find_element_by_class_name()
    browser.find_element_by_css_selector()
    browser.find_element_by_id()
    browser.find_element_by_name()

但不得不說(shuō),xpath+Chrome的組合實(shí)在是太香了。

再之后的操作就沒(méi)有什么難度了,無(wú)非是繼續(xù)選擇元素,點(diǎn)擊,跳轉(zhuǎn),點(diǎn)擊。需要注意的一點(diǎn)就是要合理的運(yùn)用selenium的等待來(lái)使網(wǎng)頁(yè)的點(diǎn)擊和跳轉(zhuǎn)之間更加平滑。

selenium的三種等待方式

1、強(qiáng)制等待

第一種是最簡(jiǎn)單也是最粗暴的方式——強(qiáng)制等待。time.sleep(2) 不管瀏覽器有沒(méi)有加載完,都要等3秒。

剛開始可以先用這種方式讓程序先跑起來(lái),之后再優(yōu)化。

2、隱性等待

第二種方式叫隱性等待,implicitly_wait(xx)

隱形等待是設(shè)置了一個(gè)最長(zhǎng)等待時(shí)間,如果在規(guī)定時(shí)間內(nèi)網(wǎng)頁(yè)加載完成,則執(zhí)行下一步,否則一直等到時(shí)間截止,然后執(zhí)行下一步。

注意這里有一個(gè)弊端,那就是程序會(huì)一直等待整個(gè)頁(yè)面加載完成,也就是一般情況下你看到瀏覽器標(biāo)簽欄那個(gè)小圈不再轉(zhuǎn),

才會(huì)執(zhí)行下一步,但有時(shí)候頁(yè)面想要的元素早就在加載完成了,

但是因?yàn)閭€(gè)別js之類的東西特別慢,我仍得等到頁(yè)面全部完成才能執(zhí)行下一步,我想等我要的元素出來(lái)之后就下一步怎么辦?有辦法,這就要看selenium提供的另一種等待方式——顯性等待了。

3、顯性等待

第三種辦法就是顯性等待,WebDriverWait,配合該類的until()和until_not()方法,

就能夠根據(jù)判斷條件而進(jìn)行靈活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果條件成立了,則執(zhí)行下一步,否則繼續(xù)等待,直到超過(guò)設(shè)置的最長(zhǎng)時(shí)間,然后拋出TimeoutException。

具體應(yīng)用到代碼中如下:

from selenium.webdriver.support import expected_conditions as EC
locator = (By.XPATH, '//*[@id="login_box"]/ul/li[1]/div/input')
WebDriverWait(browser, 3, 0.3).until(EC.presence_of_element_located(locator))

WebDriverWait類長(zhǎng)這樣:

class WebDriverWait(object):
    def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
        """Constructor, takes a WebDriver instance and timeout in seconds.
           :Args:
            - driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote)
            - timeout - Number of seconds before timing out
            - poll_frequency - sleep interval between calls
              By default, it is 0.5 second.
            - ignored_exceptions - iterable structure of exception classes ignored during calls.
              By default, it contains NoSuchElementException only.
           Example:
            from selenium.webdriver.support.ui import WebDriverWait \n
            element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) \n
            is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\ \n
                        until_not(lambda x: x.find_element_by_id("someId").is_displayed())
        """

until

method: 在等待期間,每隔一段時(shí)間調(diào)用這個(gè)傳入的方法,直到返回值不是False

message: 如果超時(shí),拋出TimeoutException,將message傳入異常

until_not

與until相反,until是當(dāng)某元素出現(xiàn)或什么條件成立則繼續(xù)執(zhí)行,

until_not是當(dāng)某元素消失或什么條件不成立則繼續(xù)執(zhí)行,參數(shù)也相同,不再贅述。

最終實(shí)現(xiàn)

知道了上面那些,就可以把我們的代碼優(yōu)化一下,用顯性等待替換掉time模塊。最終代碼如下:

# username = "xxxxxx"
# password = "xxxxxx"
# 模擬瀏覽器打開網(wǎng)站
def AutoSign(username, password):
    chrome_options = Options()
    # 使用無(wú)界面瀏覽器
    chrome_options.add_argument('--headless')
    browser = webdriver.Chrome(options=chrome_options)
    browser.get(url)
    locator = (By.XPATH, '//*[@id="login_box"]/ul/li[1]/div/input')
    # 延時(shí)2秒,以便網(wǎng)頁(yè)加載所有元素,避免之后找不到對(duì)應(yīng)的元素
    # time.sleep(2)
    WebDriverWait(browser, 3, 0.3).until(EC.presence_of_element_located(locator))
    # 這里是找到輸入框,發(fā)送要輸入的用戶名和密碼,模擬登陸
    browser.find_element_by_xpath('//*[@id="login_box"]/ul/li[1]/div/input').send_keys(username)
    browser.find_element_by_xpath('//*[@id="login_box"]/ul/li[2]/div/input').send_keys(password)
    # 在輸入用戶名和密碼之后,點(diǎn)擊登陸按鈕
    browser.find_element_by_xpath('//*[@id="login_box"]/div[2]/button[1]').click()
    WebDriverWait(browser, 3, 0.3).until(EC.visibility_of_element_located((By.ID, 'name-a')))
    time.sleep(0.5)
    browser.execute_script("window.scrollTo(0,1000);")
    # 點(diǎn)擊登陸后的頁(yè)面中的簽到,跳轉(zhuǎn)到簽到頁(yè)面
    browser.find_element_by_xpath('//*[@id="member"]/div[6]/div/div[2]/div[1]/div/div/h4').click()
    # time.sleep(1)
    # browser.execute_script("window.scrollTo(0,1000);")
    # time.sleep(1)
    browser.find_element_by_xpath('//*[@id="member"]/div[6]/div/div[2]/div[2]/div/div/a[1]/div').click()
    # time.sleep(2)
    WebDriverWait(browser, 2, 0.3).until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="sign"]/div[3]/div')))
    # 點(diǎn)擊簽到,實(shí)現(xiàn)功能
    browser.find_element_by_xpath('//*[@id="sign"]/div[3]/div').click()
    time.sleep(0.5)
    # 這個(gè)print其實(shí)沒(méi)什么用,如果真的要測(cè)試腳本是否運(yùn)行成功,可以用try來(lái)拋出異常
    print("簽到成功")
    # 腳本運(yùn)行成功,退出瀏覽器
    browser.quit()


以上是用Python實(shí)現(xiàn)自動(dòng)簽到的方法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI