[python爬蟲之路day16]:基於爬蟲的selenium庫的使用,用以獲取ajax數據

聲明:
############此處非原創,來源B站UP主神奇的老黃的分享#####################
AJAX(Asynchronouse JavaScript And XML)異步JavaScript和XML。除過在後臺與服務器進行少量數據交換,Ajax 可以使網頁實現異步更新。
這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。傳統的網頁(不使用Ajax)如果需要更新內容,必須重載整個網頁頁面。因爲傳統的在傳輸數據格式方面,使用的是XML語法。因此叫做AJAX,其實現在數據交互基本上都是使用JSON。使用AJAX加載的數據,即使使用了JS,將數據渲染到了瀏覽器中,在右鍵->查看網頁源代碼還是不能看到通過ajax加載的數據,只能看到使用這個url加載的html代碼。

##獲取ajax數據的方式:

  1. 直接分析ajax調用的接口。然後通過代碼請求這個接口。
  2. 使用Selenium+chromedriver模擬瀏覽器行爲獲取數據。
  3. | 方式 | 優點 | 缺點 |
    | -------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
    | 分析接口 | 直接可以請求到數據。不需要做一些解析工作。代碼量少,性能高。 | 分析接口比較複雜,特別是一些通過js混淆的接口,要有一定的js功底。容易被發現是爬蟲。 |
    | selenium | 直接模擬瀏覽器的行爲。瀏覽器能請求到的,使用selenium也能請求到。爬蟲更穩定。 | 代碼量多。性能低。 |

Selenium+chromedriver獲取動態數據:

Selenium相當於是一個機器人。可以模擬人類在瀏覽器上的一些行爲,自動處理瀏覽器上的一些行爲,比如點擊,填充數據,刪除cookie等。chromedriver是一個驅動Chrome瀏覽器的驅動程序,使用他纔可以驅動瀏覽器。當然針對不同的瀏覽器有不同的driver。以下列出了不同瀏覽器及其對應的driver:

  1. Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
  2. Firefox:https://github.com/mozilla/geckodriver/releases
  3. Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
  4. Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
    ##############################聲明結束##################################
from selenium import webdriver
import time
driver_path=r"C:\Users\阿吉\AppData\Local\Google\Chrome\chromedriver.exe"
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)#selenium結合chromedriver進行模擬人類在瀏覽器上的一些行爲,自動處理瀏覽器上的一些行爲
driver.get('https://www.baidu.com/')#發送請求
print(driver.page_source)#獲取源代碼
time.sleep(5)
driver.close()#關閉當前網頁
driver.quit()#關閉整個網頁,退出整個瀏覽界面
inputTag=driver.find_element_by_id('kw')
inputTag=driver.find_element_by_name('wd')
inputTag=driver.find_element_by_class_name('s_ipt')
inputTag=driver.find_element_by_xpath('//input[@id="kw"]')
inputTag=driver.find_elements_by_css_selector('.quickdelete-wrap > input')[0]#每個element都有對應的#elements以列表形式返回所有的對應值。
 inputTag.send_keys('python')
 html=etree.HTML(driver.page_source)

##如果只是想查找某一元素,那推薦使用lxml,因爲他是用C語言寫的,效率高
##如果想對元素進行一些操作,比如給文本輸入值,或者點擊某個按鈕,那就必須使用selenium的方法了。

##1.操作輸入框input

from selenium import webdriver
 import time
driver_path=r"C:\Users\阿吉\AppData\Local\Google\Chrome\chromedriver.exe"
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
 driver=webdriver.Chrome(executable_path=driver_path)
#表單元素:input   button  checkbox
使用selenium操作表單元素
driver.get('https://www.baidu.com/')
inputTag=driver.find_element_by_id('kw')
 inputTag.send_keys('python')
 time.sleep(3)
 inputTag.clear()

#2.操作checkbox

 from selenium import webdriver
 import time
 driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.douban.com/')
frame1=driver.find_element_by_xpath('//iframe@[style="height: 300px; width: 300px;"]')
driver.switch_to.frame(frame1)
rememberBtn=driver.find_element_by_name('remember')
rememberBtn.click()

  1. 選擇select:select元素不能直接點擊。因爲點擊後還需要選中元素。這時候selenium就專門爲select標籤提供了一個類selenium.webdriver.support.ui.Select。將獲取到的元素當成參數傳到這個類中,創建這個對象。以後就可以使用這個對象進行選擇了。示例代碼如下:
    from selenium.webdriver.support.ui import Select
 # 選中這個標籤,然後使用Select創建對象
   selectTag = Select(driver.find_element_by_name("jumpMenu"))
 # 根據索引選擇
  selectTag.select_by_index(1)
   # 根據值選擇
   selectTag.select_by_value("http://www.95yueba.com")
 根據可視的文本選擇
    selectTag.select_by_visible_text("95秀客戶端")
 # 取消選中所有選項
 selectTag.deselect_all()

#4. 操作按鈕:操作按鈕有很多種方式。比如單擊、右擊、雙擊等。這裏講一個最常用的。就是點擊。直接調用click函數就可以了。示例代碼如下:


   inputTag = driver.find_element_by_id('su')
   inputTag.click()

#行爲鏈

from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
 driver=webdriver.Chrome(executable_path=driver_path)
 driver.get('https://www.baidu.com/')
 inputTag=driver.find_element_by_id('kw')
 submitBin=driver.find_element_by_id('su')
 actions=ActionChains(driver)
 actions.move_to_element(inputTag)
 actions.send_keys_to_element(inputTag,'我最帥')
 actions.click(submitBin)
 actions.perform()

#selenium操作cookie

from selenium import webdriver
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com/')
for cookie in driver.get_cookies():
    print(cookie)


獲取某個cookie的值,取其name
 print('+'*30)
 print(driver.get_cookie('delPer'))
#刪除cookie
 driver.delete_cookie('delPer')
 print('+'*30)
 print(driver.get_cookie('delPer'))
 driver.delete_all_cookies()#刪除所有cookie

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

 from selenium import webdriver
 from selenium.webdriver.support.ui import WebDriverWait
 from selenium.webdriver.support import expected_conditions as EC
 from selenium.webdriver.common.by import By
 driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
 driver=webdriver.Chrome(executable_path=driver_path)
 driver.get('https://www.douban.com/')
driver.implicitly_wait(10)#隱式等待
 driver.find_element_by_id('asdfc')
#顯式等待
WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,'asddd'))
)
 WebDriverWait(driver,10).until(
     EC.presence_of_element_located((By.ID,'anony-nav'))
 )

#切換頁面,打開多個頁面並切換

 from selenium import webdriver
 driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
 driver=webdriver.Chrome(executable_path=driver_path)
 driver.get('https://www.baidu.com/')
 driver.execute_script("window.open('https://www.douban.com/')")
 print(driver.window_handles)
 driver.switch_to.window(driver.window_handles[1])#切換到豆瓣
 print(driver.current_url)

#雖然窗口切換了新頁面,但是driver沒有切換,如果是想在代碼中切換到新頁面,並且做一些爬蟲,那麼應該使用driver.switch_to.window來切換到指定的窗口,從driver.window_handles中取出具體第幾個窗口,driver.window_handles是一個列表,裏面是窗口句柄。按照打開頁面的順序存儲窗口句柄。

#設置代理IP

 from selenium import webdriver
 driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
 driver=webdriver.Chrome(executable_path=driver_path)
 options=webdriver.ChromeOptions()
 options.add_argument("--proxy-server-http://115.204.98.134:8118")
 driver.get("http://httpbin.org/ip")

#補充

from selenium import webdriver
from selenium.webdriver.remote.webelement import WebElement
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com/')
submitBtn=driver.find_element_by_id('su')
print(type(submitBtn))
print(submitBtn.get_attribute("value"))#百度一下
driver.save_screenshot('baidu.png')#保存圖片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章