1、selenium介紹
selenium最初是一個自動化測試工具,模擬用戶的操作。
而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript代碼的問題 selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點擊、下拉等,來拿到網頁渲染之后的結果,可支持多種瀏覽器,包括headless,可以在各種平台使用。
2、安裝准備
#導入模塊 from selenium import webdriver
下載應用程序與對應的驅動,這里以Windows平台為例,下載Chrome瀏覽器和對應的瀏覽器驅動
下載Chrome瀏覽器:https://www.google.cn/chrome/
查看驅動和瀏覽器版本的映射關系:http://blog.csdn.net/huilan_same/article/details/51896672
下載對應的驅動程序:http://chromedriver.storage.googleapis.com/index.html
3、selenium操作
3.1.簡單使用
from selenium import webdriver #加載相應瀏覽器的驅動文件 #這會到的一個瀏覽器的示例對象,每實例化一個對象,都會打開一個新的瀏覽器 driver=webdriver.Chrome(r'./chromedriver.exe') #打開一個新的頁面,默認多個請求鏈接會被覆蓋,只顯示最后一個請求 page=driver.get('https://www.baidu.com/') #關閉瀏覽器 driver.quit()
3.2元素定位
find_element_by_name | find_elements_by_name | 通過元素name定位 |
find_element_by_id | find_elements_by_id | 通過元素id定位 |
find_element_by_xpath | find_elements_by_xpath | 通過xpath表達式定位 |
find_element_by_link_text | find_elements_by_link_text | 通過完整超鏈接定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通過部分鏈接定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通過標簽定位 |
find_element_by_class_name | find_elements_by_class_name | 通過類名進行定位 |
find_elements_by_css_selector | find_elements_by_css_selector | 通過css選擇器進行定位 |
find_element_by_xxx找的是第一個符合條件的標簽,find_elements_by_xxx找的是所有符合條件的標簽。
from selenium import webdrive from time import sleep #加載相應瀏覽器的驅動文件 #這會到的一個瀏覽器的示例對象,每實例化一個對象,都會打開一個新的瀏覽器 driver=webdriver.Chrome(r'./chromedriver.exe') #打開一個新的頁面,默認多個請求鏈接會被覆蓋,只顯示最后一個請求 page=driver.get('https://www.baidu.com/') driver.maximize_window() # 將瀏覽器最大化,有界面的情況下正常 #通過文字定位 # driver.find_element_by_link_text('新聞').click() #等同於 # driver.find_elements_by_link_text('新聞')[0].click() # sleep(2) #通過xpath定位 # driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click() # sleep(2) #通過類名定位,當類名有多個相同時,需要find_elements_by_class_name # driver.find_elements_by_class_name('c-color-t')[0].click() # sleep(2) #通過選擇器定位 # driver.find_elements_by_css_selector('.c-color-t')[0].click() # sleep(2) #關閉瀏覽器 driver.quit()
3.3.模擬登錄
from selenium import webdriver import time #加載相應瀏覽器的驅動文件 driver=webdriver.Chrome(r'./chromedriver.exe') #打開一個新的頁面 page=driver.get('http://admin.syrinx2008.com/Admin/Members/pageList/m_type/1.html') driver.maximize_window() # 將瀏覽器最大化,有界面的情況下正常 # 輸入用戶名 username_input=driver.find_element_by_id('phone') username_input.send_keys('YOUR NAME') time.sleep(2) #輸入密碼 password_imput=driver.find_element_by_id('password') password_imput.send_keys('YOUR PWD') time.sleep(2) #手動輸入驗證碼 code_input=input('請輸入驗證碼:').strip() driver.find_element_by_id('code').send_keys(code_input) time.sleep(2) #點擊登錄 login_btn=driver.find_element_by_xpath('//ul/li[@class="subBtn"]/a') login_btn.click() time.sleep(5) #頁面數據 page_text = driver.page_source print(len(page_text)) # with open(r'./file/sq_index.html',mode='wt',encoding='utf-8') as f: # f.write(page_text) #頁面截圖 driver.save_screenshot(r'file/1.png') #關閉瀏覽器 driver.quit()
注意:當實例化的瀏覽器對象driver是一個局部變量時,會隨着函數的執行結束而回收。當元素定位可能會產生異常時候,處理異常需要關閉瀏覽器,釋放資源。
4、headless配置
在實例化一個操作對象的時候,selenium會幫助我們打開一個瀏覽器窗口。headless配置會隱藏這個窗口打開,提高執行效率。無界面的Linux系統中,必須配置headless。
from selenium import webdriver from selenium.webdriver.chrome.options import Options #構造一個配置參數對象 chrome_options = webdriver.ChromeOptions() # 最大化運行(全屏窗口),不設置,取元素會報錯 chrome_options.add_argument('--window-size=1960,1080') chrome_options.add_argument('--start-maximized') chrome_options.add_argument('--no-sandbox') #Linux系統需要配置 chrome_options.add_argument('--disable-infobars') # 禁用瀏覽器正在被自動化程序控制的提示 chrome_options.add_argument('--incognito') # 隱身模式(無痕模式) chrome_options.add_argument('--headless') # 瀏覽器不提供可視化頁面 print('正在啟動無窗口瀏覽器。。。') #構成瀏覽器操作對象,傳入驅動程序與配置對象 driver = webdriver.Chrome(settings.DRIVER,options=chrome_options) ''' 業務操作 '''
driver.quit()