聲明:
############此處非原創,來源B站UP主神奇的老黃的分享#####################
AJAX(Asynchronouse JavaScript And XML)異步JavaScript和XML。除過在後臺與服務器進行少量數據交換,Ajax 可以使網頁實現異步更新。
這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。傳統的網頁(不使用Ajax)如果需要更新內容,必須重載整個網頁頁面。因爲傳統的在傳輸數據格式方面,使用的是XML
語法。因此叫做AJAX
,其實現在數據交互基本上都是使用JSON
。使用AJAX加載的數據,即使使用了JS,將數據渲染到了瀏覽器中,在右鍵->查看網頁源代碼
還是不能看到通過ajax加載的數據,只能看到使用這個url加載的html代碼。
##獲取ajax數據的方式:
- 直接分析ajax調用的接口。然後通過代碼請求這個接口。
- 使用Selenium+chromedriver模擬瀏覽器行爲獲取數據。
- | 方式 | 優點 | 缺點 |
| -------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 分析接口 | 直接可以請求到數據。不需要做一些解析工作。代碼量少,性能高。 | 分析接口比較複雜,特別是一些通過js混淆的接口,要有一定的js功底。容易被發現是爬蟲。 |
| selenium | 直接模擬瀏覽器的行爲。瀏覽器能請求到的,使用selenium也能請求到。爬蟲更穩定。 | 代碼量多。性能低。 |
Selenium+chromedriver獲取動態數據:
Selenium
相當於是一個機器人。可以模擬人類在瀏覽器上的一些行爲,自動處理瀏覽器上的一些行爲,比如點擊,填充數據,刪除cookie等。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/
##############################聲明結束##################################
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()
- 選擇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')#保存圖片