需求背景:
很多網頁通過復雜的JS函數組合,來實現對信息的加密、異步信息處理等,導致很難分析出網頁接口。
那么最快速度的實現爬蟲功能,是模擬瀏覽器的行為,加載運行JS,才能破解頁面。
模擬瀏覽器行為,在python中的最佳實踐方案是使用selenium包。被模擬的瀏覽器可以使用chromedriver(有界面瀏覽器)或者phantomjs(無界面瀏覽器)。
所有復雜的登錄、JS加密、AJAX異步,如果無法分析出網頁接口,都可以使用selenium+browserdriver方案,來模擬瀏覽器上網。
知識點
一、什么是selenium?
selenium 是一套完整的web應用程序測試系統,包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測試的並行處理(Selenium Grid)。
selenium的核心Selenium Core基於JsUnit,完全由JavaScript編寫,因此可以用於任何支持JavaScript的瀏覽器上。
selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。
二、如果配置被模擬的瀏覽器?
那chromedriver舉例
先在百度搜chromedriver,並且下載到本地。(朱毅chromedriver.exe對應的版本要和實際安裝的chrome.exe版本一致。)
三、舉例一段模擬登陸某個網頁,並且獲取cookies的過程
下面是一段登陸網盤的模塊。如果cookies是空,那么就使用selenium打開網頁登陸一次保存cookies。如果不空,那么就直接使用緩存中的cookies。
1 from etc import jboxenv 2 from selenium import webdriver 3 from selenium.webdriver.common.by import By 4 from selenium.webdriver.support import expected_conditions as EC 5 from selenium.webdriver.support.wait import WebDriverWait 6 7 logger = jboxenv.JBOX_LOGGER 8 __jbox_cookies = {} 12 __header = { 13 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36'} 14 15 16 def get_user_cookies(username, password): 17 ''' 18 獲取JBOX的登錄cookies 19 模塊第一次使用時通過賬號密碼獲取cookie 20 登錄成功以后再申請cookie,讀取模塊中的緩存 21 :param username: 用戶名 22 :param password: 密碼 23 :return: 返回一個dict,保存了cookies字典 24 ''' 25 # 打開首頁獲取cookies 26 global __jbox_cookies 27 if __jbox_cookies.keys(): 28 return __jbox_cookies 29 else: 30 driver = webdriver.Chrome(r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe') 31 try: 32 driver.get("http://pan.jd.com/") 33 name = driver.find_element_by_id('account') 34 name.send_keys(username) 35 psd = driver.find_element_by_id('password') 36 psd.send_keys(password) 37 btn = driver.find_element_by_class_name('btnsubmint') 38 btn.click() 39 # 等待新頁面出現的某個元素出現 40 wait = WebDriverWait(driver, 10) 41 wait.until(EC.presence_of_element_located((By.ID, 'showMine'))) 42 if len(driver.get_cookies())>0: 43 for c in driver.get_cookies(): 44 __jbox_cookies[c.get('name')] = c.get('value') 45 finally: 46 driver.close() 47 #如果沒有登錄成功,就提醒需要重新登錄 48 if not __jbox_cookies.keys(): 49 logger.error('通過登錄JBOX申請cookies,登錄結果:失敗') 50 print(__jbox_cookies) 51 return __jbox_cookies 52 53 54 if __name__ == '__main__': 55 print(get_user_cookies('shwujiang', 'Fig@2016092404'))