1. 程式人生 > 實用技巧 >爬蟲之selenium模組

爬蟲之selenium模組

一 介紹

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()