日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

[python爬虫] Selenium高级篇之窗口移动、弹出对话框自登录

發布時間:2024/5/28 python 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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彈出新窗體,再獲取彈出窗體的技術介紹。需要注意每次窗口句柄移動都需要重新定位它們的主窗體。

核心代碼:

# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time import os#訪問鏈接 driver = webdriver.Firefox() url = "http://lib.csdn.net/" driver.get(url) elem_div = driver.find_elements_by_xpath("//ul[@class='list01 clearfix']/li/div[2]/a")#獲取當前窗口句柄 now_handle = driver.current_window_handle print now_handlefor elem in elem_div:print elem.text #獲取正文print elem.get_attribute('href') #獲取屬性值#點擊進入新的界面 _blank彈出 elem.click()#獲取所有窗口句柄 all_handles = driver.window_handles #彈出兩個界面,跳轉到不是主窗體界面 for handle in all_handles: if handle!=now_handle: #輸出待選擇的窗口句柄 print handle driver.switch_to_window(handle) time.sleep(1) print u'彈出界面信息' print driver.current_url print driver.title #獲取登錄連接信息 elem_p = driver.find_element_by_xpath("//div[@class='coltop clearfix']/div[2]") print elem_p.text #關閉當前窗口 driver.close() #輸出主窗口句柄 print now_handle driver.switch_to_window(now_handle) #返回主窗口 開始下一個跳轉 步驟如下:
? ? 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暫停,輸入驗證碼,然后自動登錄即可,登錄后即可爬取相關信息。
核心代碼如下:

# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time import os#訪問鏈接 driver = webdriver.Firefox() url = "https://www.baidu.com/" driver.get(url) #失敗 elem_login = driver.find_element_by_xpath("//a[@name='tj_login']") #成功 elem_login = driver.find_element_by_xpath("//div[@id='u1']/a[7]")#獲取當前窗口句柄 now_handle = driver.current_window_handle print now_handle#獲取當前登錄按鈕信息 print elem_login.text print elem_login.get_attribute('href') elem_login.click() time.sleep(2)#選擇彈出的對話框 driver.switch_to_alert()#獲取用戶名和密碼 elem_name = driver.find_element_by_xpath("//input[@name='userName']") elem_name.send_keys(u"eastmount") elem_pwd = driver.find_element_by_xpath("//input[@name='password']") elem_pwd.send_keys("12345678") time.sleep(10) elem_pwd.send_keys(Keys.RETURN) 登錄后如下圖所示:




最后希望這篇文章對你有所幫助,原理和方法更重要,希望你也能靈活應用。繼續享受博客和教學吧,同時期待我最近欣賞的某個人吧!楊老師綠幺加油~
? ? 不愿清醒,寧愿一直沉迷放縱。
? ? 不知歸路,寧愿一世無悔追逐。
? ? 再苦再累,也笑看庭前花開花落。
(By:Eastmount 2017-08-10 晚上11點半??http://blog.csdn.net/eastmount/?)


總結

以上是生活随笔為你收集整理的[python爬虫] Selenium高级篇之窗口移动、弹出对话框自登录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。