python爬蟲10:使用selenium模擬瀏覽器登錄賬號


需求背景:

很多網頁通過復雜的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'))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM