selenium+python的網站爬蟲
爬取網站聽起來就是程式設計師的標配,之前一直沒有時間學一下,最近有空學習一下順便記錄一下
爬取網站實際上就是利用計算機模擬人的操作來對網站的前端進行訪問,而各大瀏覽器也給計算機提供了訪問的介面,也就是瀏覽器驅動,計算機通過編寫好的庫訪問瀏覽器驅動,就可以直接訪問網頁,但與人去訪問不同的事,沒有圖形化的介面給計算機去進行點選的操作,選中輸入框,輸入文字,點選提交,這一系列操作的前提都是得先選中輸入框,因此先了解計算機如何選中輸入框的,以及如何定位到位置
雖然呈現給使用者的介面是圖形化介面,但本質還是使用HTML、CSS和js來構建的,點選實際上也是觸發了前端元素的事件,因此直接選擇前端元素,和滑鼠操作的目的是一樣的
選擇元素的兩種方式:(1)使用元素的id、名稱、類別進行直接選擇,通過find_elements(By.ID,"ID")執行操作,與之相同的還有find_elements(By.CLASS_NAME,"class"),find_elements(By.TAG_NAME,"tagname")
#匯入selenium from selenium import webdriver #匯入對對應瀏覽器驅動的包,這裡我使用的是微軟的edge,不同的瀏覽器,驅動不同 from selenium.webdriver.edge.service import Service #匯入選擇 from selenium.webdriver.common.by import By #通過webdriver載入對應瀏覽器的驅動,這樣需要載入全限定名,r表示後面的字串不使用\轉義,另一種方法是將路徑加入到環境變數中,可以省去這一步 wb=webwebdriver.Edge(service=Service(r"D:\softwore in compile\Edge-driver\msedgedriver.exe")) #讓瀏覽器驅動載入一個頁面,這個頁面實際上就是一個html,如果這個html裡還嵌套了一個html是無法訪問的 wb.get("https://www.baidu.com/") #選擇了一個元素,並將之賦值給element element=wb.find_elements(By.ID,"kw") #此時可以對element做操作,由於使用的是wb.find_elements,因此返回的是一個元素陣列, element[0].send_key("黑色")#此時向輸入框輸入了黑色兩個字,但沒有點選 element=wb.find_element(By.ID,"su") element.click()#這裡定位到了”百度一下“的元素,並執行了點選操作
(2)通過CSS選擇器
類似於By.id方法,使用了By.CSS_SELECTOR,"引數”,不需要在前面規定引數到底是id還是Tag名稱還是類,使用id作為引數時在以"#id"傳參,使用類名時以 ”.類名“ 作為傳參
在選擇的元素內,依舊可以執行選擇元素的操作,但是如果選擇的元素是一個iframe或者是另一個html,就無法執行選擇操作了,因為元素選擇這個操作是使用載入了網頁的webDriver來實現的,而最開始的webDriver載入的網頁已經確定了,也就是已經綁定了一個html,這個時候要載入內部的iframe或者html,是屬於另一個頁面,需要執行wd.switch_to.frame(frame_reference)
其中, frame_reference 可以是 frame 元素的屬性 name 或者 ID 。也可以填寫frame 所對應的 WebElement 物件。
比如這裡,就可以填寫 iframe元素的id ‘frame1’ 或者 name屬性值 ‘innerFrame’