0127程式設計-Selenium爬蟲工具
Selenium主要包含:
- Webdriver,各種瀏覽器驅動軟體,用來控制瀏覽器的。
- API,各種程式語言可以呼叫的模組,程式碼通過它銜接Webdriver進而控制瀏覽器。
- Server,服務程式,如果你需要遠端控制其他電腦上的程式碼和Webdriver,就要在那些電腦上裝這個服務程式。
- IDE,瀏覽器外掛,有介面,快速方便的執行簡單測試,參考這裡。
大多數情況下,我們只要Webdriver和API就夠了。
Python安裝環境
-
先下載對應瀏覽器的Webdriver。谷歌Chrome瀏覽器點這裡 ,注意你的Chrome應該升級到70版本以上,下載後無需安裝,放在固定的目錄就好。
-
安裝API,使用命令
conda install -c conda-forge selenium
或者pip直接裝,有些慢,多等等。
安裝成功之後,測試以下程式碼,順利彈出瀏覽器開啟百度的話就成功了。
from selenium import webdriver driver = webdriver.Chrome('/Applications/chromedriver') driver.get("http://www.baidu.com")
頁面元素提取
先看一下程式碼:
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome('/Applications/chromedriver') #替換為你的chromdriver拷貝的目錄 driver.get("https://su.58.com/zufang/pn2/?PGTID=0d300008-0000-5965-8ce1-1873463f7758&ClickID=1") litag=driver.find_element(By.CLASS_NAME,'listUl') li=litag.find_elements(By.TAG_NAME,'li') len(li) li[3].text
這裡直接從driver中find_element
,引數(By.CLASS_NAME,'listUl')
是通過class名來搜尋單個元素,相應的find_elements
則是搜尋多個元素。
除了By. CLASS_NAME
還可以:
(by=By.ID, value=tagid") (By.TAG_NAME, "div") (By.NAME, "tagnameAttr") (By.LINK_TEXT, "點選這裡檢視詳情") (By.PARTIAL_LINK_TEXT, "詳情") (By.CSS_SELECTOR, "#food span.dairy.aged") (By.XPATH, "//input")
官方預設並沒有提供通過任意屬性獲得元素的方法,這種問題只能通過xpath來實現,比如driver.find_element(By.XPATH,'//ul[@class="listUl"]')
可以提取class屬性為listUI的ul標記元素。
除了直接從html中提取,還可以用js程式碼提取:
driver.execute_script("return $('.cheese')[0]") #對於使用jquery的頁面
甚至可以傳遞引數進去,下面這個命令直接在瀏覽器中彈窗:
msg = 'Hello Selenium!' driver.execute_script(''' alert(arguments[0]) ''', msg)
控制頁面互動
inputElement.send_keys("cheese!") inputElement.submit() btnElement.click()
選擇選項:
from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_tag_name("select")) select.deselect_all() select.select_by_visible_text("Edam")
切換瀏覽器選項卡:
for handle in driver.window_handles: driver.switch_to.window(handle)
切換到彈窗:
alert = driver.switch_to.alert #alert.dismiss()
前進後退
driver.forward() driver.back()
Cookie操作:
driver.get("http://www.example.com") driver.add_cookie({'name':'key', 'value':'value', 'path':'/'})L for cookie in driver.get_cookies(): print "%s -> %s" % (cookie['name'], cookie['value']) driver.delete_cookie("CookieName") driver.delete_all_cookies()
拖拽實現:
from selenium.webdriver.common.action_chains import ActionChains element = driver.find_element_by_name("source") target =driver.find_element_by_name("target") ActionChains(driver).drag_and_drop(element, target).perform()
等待頁面載入
Selenium並沒有直接頁面ready的回撥,但提供了對任意元素狀態的監聽:
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 from selenium.common.exceptions import TimeoutException browser = webdriver.Firefox() browser.get("url") delay = 3 #最多等3秒 try: elem=EC.presence_of_element_located((By.ID, 'IdOfMyElement')) myElem = WebDriverWait(browser, delay).until(elem) print "Element is ready!" except TimeoutException: print "Loading took too much time!"
expected_conditions
不僅提供了元素是否存在presence_of_element_located
的監聽,而且可以檢測元素是否可用、是否顯示、是否可點選等多種情況。
更多資料
Selenium最強大的地方在於它直接控制瀏覽器,也就是,只要在瀏覽器中最終展示的資料都可以通過Selenium得到,無論是html還是js後續填充的內容。當然Selenium缺點就是經常浪費了瀏覽器的渲染時間,畢竟我們要的是資料而不是瀏覽器畫面。
每個人的智慧新時代
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~
END