[python爬虫] Selenium高级篇之窗口移动、弹出对话框自登录
在我們使用Selenium Python制作自動爬蟲和網頁自動測試的時候,通常會遇到彈出新的窗體或對話框的時候,此時你捕獲的窗體已經被打斷,從而干擾你的爬蟲。
那怎么解決這個問題呢?
本篇文章主要記錄兩段代碼解決這類問題:
? ? 第一個是click()函數點擊超鏈接后,需要捕獲彈出新窗體的信息,此時需要調用switch_to_window()函數切換窗體,再捕獲新的數據;
? ? 第二個是click()函數點擊超鏈接后,彈出登錄的對話框,比如百度首頁登錄,此時需要調用switch_to_alert()函數獲取該alert對象。
文章主要是結合實際問題進行敘述,內容比較基礎,希望對您有所幫助,如果存在錯誤或不足之處,還請海涵。更多爬蟲主題參考我的專欄:http://blog.csdn.net/column/details/eastmount-spider.html
一. Switch_to_window函數實現窗體切換
在使用Selenium爬取知識過程,通常會遇到_blank彈出新窗體,或窗體是彈出的那種情況,而且有的需要登錄,如:新浪微博、公眾號、京東等,使用webdriver.Firefox()重新打開新窗體是無法加載已有信息的。這時候就需要通過獲取當前句柄再進行窗口切換。
這里使用該方法實現獲取CSDN知識庫的關鍵詞的標題及超鏈接信息,因為它是_blank彈出新窗體,再獲取彈出窗體的技術介紹。需要注意每次窗口句柄移動都需要重新定位它們的主窗體。
核心代碼:
? ? 1.首先,current_window_handle獲取當前首頁窗體并保存;
? ? 2.然后調用find_elements_by_xpath()獲取首頁多個關鍵詞超鏈接(多個<li>),for循環訪問;
? ? 3.在循環中點擊超鏈接,彈出新的窗體,循環找到不是首頁窗體的,調用switch_to_window進行跳轉;
? ? 4.爬取新窗體關鍵詞的介紹信息,位于div[@class='coltop clearfix']/div[2]下;
? ? 5.關閉當前窗體,重新返回首頁窗體的超鏈接,循環執行3-5步驟。
部分輸出如下所示:
主窗體: {3f9dc2dc-d468-4695-9fb8-493b9d1dd245} Android http://lib.csdn.net/base/android {9e7fbd44-b487-479d-8c5a-c5dd387a1b48} Android知識庫 - 知識庫 - 你身邊的技術百科全書 - CSDN 標準知識圖譜 我的知識圖譜(27234) Android是一個基于Linux內核的移動操作系統,由Google成立的Open Handset Alliance(OHA,開放手持設備聯盟)持續領導與開發,主要設計用于觸控熒幕移動設備如智能手機和平板電腦。 知識節點: 搭建App開...熟悉Android...APP基礎軟件架構設...App高級開... 更多{3f9dc2dc-d468-4695-9fb8-493b9d1dd245} React http://lib.csdn.net/base/react {82d2e23b-dc70-424c-a2db-bf8710844ca7} React知識庫 - 知識庫 - 你身邊的技術百科全書 - CSDN 標準知識圖譜 我的知識圖譜(2012) React是一個Facebook和Instagram用來創建用戶界面的JavaScript庫,用于構建“可預期的”和“聲明式的”Web用戶界面。 該框架的推出主要為了開發隨著時間數據不斷變化的大規模應用程序。 知識節點: 基礎語法插件視圖與數據...工程化路由細化 更多 CSDN知識庫如下圖所示,首頁顯示了多個技術的關注信息及資源數量。
審查元素如下圖所示,Android技術等均在<ul>標簽下,通過多個<li></li>實現,此時獲取Android超鏈接的url,并點擊其操作。
點擊后,會彈出新的窗體,而Selenium卻定位了當前首頁的窗體,此時就需要利用switch_to_window來切換窗體。
審查元素對應的HTML源碼如下:
二. Switch_to_alert函數捕獲彈出對話框
注意:一定不要嘗試該方法登陸百度、新浪、淘寶這些網站后爬取數據,賬號可能被永久封號的。
比如百度首頁,點擊登錄界面會彈出對話框如下圖所示:
首先,需要獲取“登錄”的位置,超鏈接<a>直接xpath定位總是失敗,故作者才采用的<div id='u1'>進行定位,超鏈接位于第7個超鏈接。
#失敗
elem_login = driver.find_element_by_xpath("//a[@name='tj_login']")
#成功
elem_login = driver.find_element_by_xpath("//div[@id='u1']/a[7]")
然后,彈出的對話框采用driver.switch_to_alert()方法選擇alert對象。
獲取用戶名和密碼后,需要設置sleep暫停,輸入驗證碼,然后自動登錄即可,登錄后即可爬取相關信息。
核心代碼如下:
最后希望這篇文章對你有所幫助,原理和方法更重要,希望你也能靈活應用。繼續享受博客和教學吧,同時期待我最近欣賞的某個人吧!楊老師綠幺加油~
? ? 不愿清醒,寧愿一直沉迷放縱。
? ? 不知歸路,寧愿一世無悔追逐。
? ? 再苦再累,也笑看庭前花開花落。
(By:Eastmount 2017-08-10 晚上11點半??http://blog.csdn.net/eastmount/?)
總結
以上是生活随笔為你收集整理的[python爬虫] Selenium高级篇之窗口移动、弹出对话框自登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [渗透攻防] 四.详解MySQL数据库攻
- 下一篇: 【python数据挖掘课程】十六.逻辑回