動態HTML技術瞭解

八、動態HTML技術瞭解

8.1 ajax基本介紹

  • 動態瞭解HTML技術
    • JS是⽹絡上最常⽤的腳本語⾔,它可以收集⽤戶的跟蹤數據,不需要重載⻚⾯ 直接提交表單,在⻚⾯嵌⼊多媒體⽂件,甚⾄運⾏⽹⻚
    • jQuery:jQuery是⼀個快速、簡介的JavaScript框架,封裝了JavaScript常⽤的功能代碼
    • ajax:ajax可以使⽤⽹⻚實現異步更新,可以在不重新加載整個⽹⻚的情況下,對⽹⻚的某部分進⾏更新
  • 獲取ajax數據的⽅式
    • 1.直接分析ajax調⽤的接⼝。然後通過代碼請求這個接⼝。
    • 2.使⽤Selenium+chromedriver模擬瀏覽器⾏爲獲取數據。(需將chromedriver放入python的解釋器中)
方式 優點 缺點
分析接⼝ 直接可以請求到數據。 不需要做⼀些解析⼯作。代碼量少,性能⾼ 別是一些通過js混淆的接口,要有一定的js功底。容易被發現是爬蟲。
selenium 直接模擬瀏覽器的⾏爲。瀏覽器能請求到的,使⽤selenium也能請求到。爬⾍更穩定。 代碼量多。性能

8.2 Selenium+chromedriver獲取動態數據

8.2.1 Selenium 介紹

  • selenium是⼀個web的⾃動化測試⼯具,最初是爲⽹站⾃動化測試⽽開發的,selenium可以直接運⾏在瀏覽器上,它⽀持所有主流的瀏覽器,可以接收指令,讓瀏覽器⾃動加載⻚⾯,獲取需要的數據,甚⾄⻚⾯截屏

  • chromedriver是⼀個驅動Chrome瀏覽器的驅動程序,使⽤他纔可以驅動瀏覽器。當然針對不同的瀏覽器有不同的driver。以下列出了不同瀏覽器及其對應的driver:

    • Chrome:
      https://sites.google.com/a/chromium.org/chromedriver/downloads

    • Firefox:https://github.com/mozilla/geckodriver/releases

    • Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

    • Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

  • 下載chromedriver

  • 百度搜索:淘寶鏡像(https://npm.taobao.org/)

  • 安裝總結:https://www.jianshu.com/p/a383e8970135

  • 安裝 Selenium :pip install selenium

8.3 Phantomjs快速入門

⽆頭瀏覽器:⼀個完整的瀏覽器內核,包括js解析引擎,渲染引擎,請求處理等,但是不包括顯示和⽤戶交互⻚⾯的瀏覽器。

from selenium import webdriver
import time
#PhantomJS 無界面瀏覽器,導入phantomjs.exe路徑
driver=webdriver.PhantomJS('F:\pthonStudyFile\jichu\爬蟲\phantomjs.exe')

#打開百度
driver.get('https://www.baidu.com/')


#定位操作,輸入搜索內容python
driver.find_element_by_id('kw').send_keys('python')

#百度一下按鈕
driver.find_element_by_id('su').click()
time.sleep(3)

#查看網頁源代碼
print(driver.page_source)

#查看當前請求的url地址
print(driver.current_url)

#截屏
driver.save_screenshot('baidu.png')

8.4 selenium快速入門

from selenium import webdriver
import time

driver=webdriver.Chrome()

#打開百度
driver.get('https://www.baidu.com/')

#窗口最大化
driver.maximize_window()
#窗口最小化
driver.minimize_window()
print()
#關閉窗口
driver.close()

#等待三秒
time.sleep(3)
#退出瀏覽器
driver.quit()

8.4.1 定位元素

方法 功能
find_element_by_id 根據id來查找某個元素
find_element_by_class_name 根據類名查找元素
find_element_by_name 根據name屬性的值來查找元素
find_element_by_tag_name 根據標籤名來查找元素
find_element_by_xpath 根據xpath語法來獲取元素
find_element_by_css_selector 根據css選擇器選擇元素
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver=webdriver.Chrome()

#打開百度
driver.get('https://www.baidu.com/')

#定位元素
# find_element_by_id 跟着id來查找某個元素

#找到輸入框,並輸入文本
#根據id定位元素
driver.find_element_by_id('kw').send_keys('python')
driver.find_element(By.ID,'kw').send_keys('java')

# 根據類名查找元素
driver.find_element_by_class_name('s_ipt').send_keys('C++')
driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('C')

#根據name屬性來查找元素
driver.find_element_by_name('wd').send_keys('php')
driver.find_element(By.NAME,'wd').send_keys('Go')


#根據標籤名查找元素
head=driver.find_element_by_tag_name('head')
print(head)

# 根據xpath語法來獲取元素
driver.find_element_by_xpath('//input[@id="kw"]').send_keys('R')

# 根據css選擇器選擇元素
driver.find_element_by_css_selector('.s_ipt').send_keys('python')

inputTag=driver.find_elements_by_tag_name('input')
print(inputTag,len(inputTag))
# driver.close()
  • 要注意, find_element 是獲取第⼀個滿⾜條件的元素。 find_elements 是獲取所有滿⾜條件的元素

8.4.2 操作表單元素

方法 功能
send_keys(value) 將數據填充入輸入框
clear() 清除輸入框中的內容
click() 鼠標點擊事件
switch_to_frame(iframe位置) 卻換到iframe
select_by_value(value) 根據值來選擇元素
select_by_index(3) 根據索引來選擇元素
  • 1.操作輸入框:1.找到這個元。2.使用send_keys(value),將數據填充進去
  • 使用clear()方法可以清除輸入框中的內容
  • 2.操作checkbox(如點擊記住密碼自動登錄按鈕)
    • 因爲要選中checkbox標籤,在⽹⻚中是通過⿏標點擊的。因此想要選中checkbox標籤,那麼先選中這個標籤,然後執⾏click()事件
rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  • 3.操作按鈕
    • 操作按鈕有很多種⽅式。⽐如單擊、右擊、雙擊等。這⾥講⼀個最常⽤的。就 是點擊。直接調⽤click函數就可以了。
inputTag = driver.find_element_by_id('su') inputTag.click()
  • 4.選擇select(下拉列表)
    • select元素不能直接點擊。因爲點擊後還需要選中元素。這時候selenium就專 ⻔爲select標籤提供了⼀個類selenium.webdriver.support.ui.Select。將獲取到的元素當成參數傳到這個類中,創建這個對象。以後就可以使⽤這個對象進⾏選擇了。https://www.17sucai.com/boards/53562.html
  • 5.操作下拉列表案例
from selenium import webdriver
import time
from selenium.webdriver.support.ui import Select

driver=webdriver.Chrome()
# 打開目標網站
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')

#切換iframe(獨立於源碼外的一個url,擁有特定的功能)
driver.switch_to_frame(driver.find_element_by_id('iframe'))
#找到下拉框
selectTag=Select(driver.find_element_by_class_name('nojs'))

#選擇方式
# 1.根據值來選擇
selectTag.select_by_value('AU')

#2.根據索引來選擇
selectTag.select_by_index(3)
  • 6.登錄豆瓣案例
from selenium import webdriver
import time
from selenium.webdriver.support.ui import Select

driver=webdriver.Chrome()
#登錄豆瓣
driver.get('https://www.douban.com/')
#卻換iframe
login_iframe=driver.find_element_by_xpath('//div[@class="login"]/iframe')
driver.switch_to_frame(login_iframe)
time.sleep(2)

#卻換登錄方式
driver.find_element_by_xpath('//li[@class="account-tab-account"]').click()
#選中checkbox選項
driver.find_element_by_id('account-form-remember').click()
# 輸入賬號密碼
driver.find_element_by_id('username').send_keys('123456')
driver.find_element_by_id('password').send_keys('mima')
# 點擊登錄按鈕
driver.find_element_by_class_name('btn-account').click()

8.5 行爲鏈

  • 有時候在⻚⾯中的操作可能要有很多步,那麼這時候可以使⽤⿏標⾏爲鏈類ActionChains來完成。⽐如現在要將⿏標移動到某個元素上並執⾏點擊事件

  • 常用方法:詳情見 https://selenium-python.readthedocs.io/api.html

    方法 功能
    click_and_hold(element) 點擊但不鬆開⿏標
    context_click(element) 右鍵點擊
    double_click(element) 雙擊
    move_to_element(element) 移動鼠標
    actions.perform() 提交行爲鏈
    from selenium.webdriver import ActionChains
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.get('https://www.baidu.com/')
    #定位到輸入框
    inputTag=driver.find_element_by_id('kw')
    
    #定位到百度按鈕
    submitBtn=driver.find_element_by_id('su')
    
    #實例化
    actions=ActionChains(driver)
    
    #把鼠標移動到輸入框
    actions.move_to_element(inputTag)
    
    #輸入內容 
    actions.send_keys_to_element(inputTag,'python')
    
    #點擊按鈕 百度一下
    actions.move_to_element(submitBtn)
    actions.click()
    
    #點擊右鍵
    actions.context_click()
    #提交行爲鏈的操作
    actions.perform()
    

8.6 Cookie操作

  • 獲取所有cookie:cookies = driver.get_cookies()
  • 根據cookie的name獲取cookie :value = driver.get_cookie(key)
  • 刪除某個cookie:driver.delete_cookie('key')

8.7 頁面等待

現在的⽹⻚越來越多采⽤了 Ajax 技術,這樣程序便不能確定何時某個元素完全加載出來了。如果實際⻚⾯等待時間過⻓導致某個dom元素還沒出來,但是你的代碼直接使⽤了這個WebElement,那麼就會拋出NullPointer的異常。爲了解決這個問題。所以 Selenium 提供了兩種等待⽅式:⼀種是隱式等待、⼀種是顯式等待

  • 隱式等待:調⽤driver.implicitly_wait()。那麼在獲取不可⽤的元素之前,會先等待10秒中的時間 driver.implicitly_wait(10)

  • 顯示等待:顯示等待是表明某個條件成⽴後才執⾏獲取元素的操作。也可以在等待的時候指定⼀個最⼤的時間,如果超過這個時間那麼就拋出⼀個異 常。顯示等待應該使⽤selenium.webdriver.support.excepted_conditions 期望的條件和selenium.webdriver.support.ui.WebDriverWait來配合完成

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
try:
	element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:
	driver.quit()

⼀些其他的等待條件

  • presence_of_element_located():某個元素已經加載完畢了。

  • presence_of_all_elements_located():⽹⻚中所有滿⾜條件的元素都加載完畢了。

  • element_to_be_clickable():某個元素是可以點擊了。

更多條件請參考:http://selenium-python.readthedocs.io/waits.html

8.8 打開多窗口和卻換頁面

  • 有時候窗⼝中有很多⼦tab⻚⾯。這時候肯定是需要進⾏切換的。selenium提供了⼀個叫做switch_to_window來進⾏切換,具體切換到哪個⻚⾯,可以從driver.window_handles中找到
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/') # 打開百度

driver.execute_script('window.open("https://www.douban.com/")') # 打開豆瓣

# driver.get('https://www.douban.com/')

# driver.close() # 關閉的是百度

# driver.quit() # 2個都關閉了

driver.find_element_by_id('kw').send_keys('python') # 操作的是百度

print(driver.current_url) # 打印網址 打印的是百度

driver.switch_to_window(driver.window_handles[1])#數字表示第幾個url

print(driver.current_url)

8.9 登錄qq郵箱

from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('https://mail.qq.com/') # 打開百度
login_frame=driver.find_element_by_id('login_frame')
driver.switch_to_frame(login_frame)
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').send_keys('qq賬號')
driver.find_element_by_id('p').send_keys('qq密碼')
driver.find_element_by_id('login_button').click()

2.14.10 登錄淘寶

# 打開網址 https://www.taobao.com/
# 點擊登錄
# 點擊進入購物車 https://cart.taobao.com/cart.htm
# 全選商品
# 點擊結算
# 點擊提交訂單 生成一個訂單 代表着商品已經搶購了


from selenium import webdriver
import time,datetime

def login():

    # 進入淘寶
    driver.get('https://www.taobao.com/')

    # 點擊登錄
    driver.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click()
    # # 登錄的方式
    #     # # 賬號密碼
    #     # driver.find_element_by_id('fm-login-id').send_keys('1212313')
    #     # time.sleep(1)
    #     # driver.find_element_by_id('fm-login-password').send_keys('fdfdfdf')
    #     # # 登錄按鈕
    #     # driver.find_element_by_class_name('fm-button').click()
    time.sleep(6)

    driver.get('https://cart.taobao.com/cart.htm')

    now = datetime.datetime.now()

    print('登錄成功,當前時間爲',now.strftime('%Y-%m-%d %H:%M:%S'))

def buy(times):

    while True:

        now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')

        # 現在的時間要大於搶購的時間
        if now > times:

            # 點擊全選
            while True:

                try:
                    if driver.find_element_by_xpath('//*[@id="J_SelectAll1"]/div'):
                        driver.find_element_by_xpath('//*[@id="J_SelectAll1"]/div').click()
                        break
                except:
                    print('找不到全選按鈕')
            time.sleep(1)
            # 點擊結算
            while True:

                try:
                    if driver.find_element_by_xpath('//*[@id="J_Go"]/span'):
                        driver.find_element_by_xpath('//*[@id="J_Go"]/span').click()
                        break
                except:
                    print('找不到結算按鈕')
            # 提交訂單
            time.sleep(3)
            while True:

                try:
                    if driver.find_element_by_xpath('//*[@id="submitOrderPC_1"]/div/a[2]'):
                        driver.find_element_by_xpath('//*[@id="submitOrderPC_1"]/div/a[2]').click()
                        break
                except:
                    print('找不到結算按鈕')

if __name__ == '__main__':

    times = input('請輸入搶購的時間:')

    driver = webdriver.Chrome()

    login()

    buy(times)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章