爬蟲之selenium模組
阿新 • • 發佈:2020-08-04
一 介紹
selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript程式碼的問題 selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點選、下拉等,來拿到網頁渲染之後的結果,可支援多種瀏覽器 from selenium import webdriver browser=webdriver.Chrome() browser=webdriver.Firefox() browser=webdriver.PhantomJS() browser=webdriver.Safari() browser=webdriver.Edge()
二 安裝
1、有介面瀏覽器
#安裝:selenium+chromedriver pip3 install selenium 下載chromdriver.exe放到python安裝路徑的scripts目錄中即可,注意最新版本是2.38,並非2.9 國內映象網站地址:http://npm.taobao.org/mirrors/chromedriver/2.38/ 最新的版本去官網找:https://sites.google.com/a/chromium.org/chromedriver/downloads #驗證安裝 C:\Users\Administrator>python3 Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type"help", "copyright", "credits" or "license" for more information. >>> from selenium import webdriver >>> driver=webdriver.Chrome() #彈出瀏覽器 >>> driver.get('https://www.baidu.com') >>> driver.page_source #注意: selenium3預設支援的webdriver是Firfox,而Firefox需要安裝geckodriver 下載連結:https://github.com/mozilla/geckodriver/releases
2、無介面瀏覽器
PhantomJS不再更新
#安裝:selenium+phantomjs pip3 install selenium 下載phantomjs,解壓後把phantomjs.exe所在的bin目錄放到環境變數 下載連結:http://phantomjs.org/download.html #驗證安裝 C:\Users\Administrator>phantomjs phantomjs> console.log('egon gaga') egon gaga undefined phantomjs> ^C C:\Users\Administrator>python3 Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from selenium import webdriver >>> driver=webdriver.PhantomJS() #無介面瀏覽器 >>> driver.get('https://www.baidu.com') >>> driver.page_source
在 PhantomJS 年久失修, 後繼無人的節骨眼
Chrome 出來救場, 再次成為了反爬蟲 Team 的噩夢
自Google 釋出 chrome 59 / 60 正式版 開始便支援Headless mode
這意味著在無 GUI 環境下, PhantomJS 不再是唯一選擇
# selenium+谷歌瀏覽器headless模式 #selenium:3.12.0 #webdriver:2.38 #chrome.exe: 65.0.3325.181(正式版本) (32 位) from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('window-size=1920x3000') #指定瀏覽器解析度 chrome_options.add_argument('--disable-gpu') #谷歌文件提到需要加上這個屬性來規避bug chrome_options.add_argument('--hide-scrollbars') #隱藏滾動條, 應對一些特殊頁面 chrome_options.add_argument('blink-settings=imagesEnabled=false') #不載入圖片, 提升速度 chrome_options.add_argument('--headless') #瀏覽器不提供視覺化頁面. linux下如果系統不支援視覺化不加這條會啟動失敗 chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" #手動指定使用的瀏覽器位置 driver=webdriver.Chrome(chrome_options=chrome_options) driver.get('https://www.baidu.com') print('hao123' in driver.page_source) driver.close() #切記關閉瀏覽器,回收資源
三 基本使用
# pip3 install selenium # 瀏覽器驅動:http://npm.taobao.org/mirrors/chromedriver/ # 驅動要跟瀏覽器版本對應 84.0.4147.105:驅動用84.0.4147.30/ # 下載完解壓就是個exe(不同平臺的可執行檔案) from selenium import webdriver import time # bro=webdriver.Chrome() # 得到一個谷歌瀏覽器物件, # 指定使用那個驅動,建議驅動放在專案根路徑下 bro = webdriver.Chrome(executable_path='./chromedriver.exe') # 得到一個谷歌瀏覽器物件, time.sleep(2) bro.get('https://www.baidu.com/') # 在位址列裡輸入了百度 time.sleep(2) print(bro.page_source) # 拿到頁面資料 time.sleep(2) bro.close()
四 選擇器
一 基本用法
# 官網連結:http://selenium-python.readthedocs.io/locating-elements.html from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By # 按照什麼方式查詢,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys # 鍵盤按鍵操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait # 等待頁面載入某些元素 import time driver = webdriver.Chrome() driver.get('https://www.baidu.com') wait = WebDriverWait(driver, 10) try: # ===============所有方法=================== # 1、find_element_by_id # 2、find_element_by_link_text # 3、find_element_by_partial_link_text # 4、find_element_by_tag_name # 5、find_element_by_class_name # 6、find_element_by_name # 7、find_element_by_css_selector # 8、find_element_by_xpath # 強調: # 1、上述均可以改寫成find_element(By.ID,'kw')的形式 # 2、find_elements_by_xxx的形式是查詢到多個元素,結果為列表 ''' #===============示範用法=================== # 1、find_element_by_id print(driver.find_element_by_id('kw')) # 2、find_element_by_link_text # login=driver.find_element_by_link_text('登入') # login.click() # 3、find_element_by_partial_link_text login=driver.find_elements_by_partial_link_text('錄')[0] login.click() # 4、find_element_by_tag_name print(driver.find_element_by_tag_name('a')) # 5、find_element_by_class_name button=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'tang-pass-footerBarULogin'))) button.click() # 6、find_element_by_name input_user=wait.until(EC.presence_of_element_located((By.NAME,'userName'))) input_pwd=wait.until(EC.presence_of_element_located((By.NAME,'password'))) commit=wait.until(EC.element_to_be_clickable((By.ID,'TANGRAM__PSP_10__submit'))) input_user.send_keys('18611453110') input_pwd.send_keys('xxxxxx') commit.click() # 7、find_element_by_css_selector driver.find_element_by_css_selector('#kw') # 8、find_element_by_xpath ''' time.sleep(5) finally: driver.close()
示例:模擬谷歌瀏覽器開啟百度,在搜尋框搜尋關鍵字
from selenium import webdriver import time bro=webdriver.Chrome(executable_path='./chromedriver.exe') # 得到一個谷歌瀏覽器物件, bro.get('https://www.baidu.com/') # 在位址列裡輸入了百度 time.sleep(0.01) input_k=bro.find_element_by_id('kw') input_k.send_keys('美女') # 在框裡寫入美女 time.sleep(2) sou = bro.find_element_by_id('su') # 找到搜尋按鈕 sou.click() # 點選搜尋按鈕 time.sleep(4) bro.close()