python爬虫 Selenium切换窗口句柄及调用Chrome浏览器

发布时间:2017-09-11 12:01:26
python爬虫 Selenium切换窗口句柄及调用Chrome浏览器 因为我的博客是根据我每个阶段自己做的事情而写的,所以前言可能有点跑题,但它更有利于让我回忆这个阶段自己的所作所为。这篇文章主要介绍Selenium爬虫获取当前窗口句柄、切换窗口句柄以及调用Chrome浏览器几个知识点,其中获取当前句柄的方法是非常重要的一个知识点,只有真正遇到的时候才能体会到它的强大。

最近课程比较多,写博客的内容也比较杂,包括网站搭建、HTML设计、计算机图形学、Python数据挖掘、Flash动画等。同时,这周也有老师让我帮忙写几个爬虫,自己进一步理解了爬虫的好处:一方面,人文课题如果运用计算机相关编程知识,确实能够解决很多问题并提升效率。

另一方面,我爬虫主要使用Selenium、BeautifulSoup和Scrapy,其中Selenium能够结合浏览器解决登录验证码、扫二维码、效果预览、自动测试等问题;BeautifulSoup的优势是速度,两种方法都是通过分析DOM树结构实现的。
希望这篇文章对你有所帮助,如果有错误或不足之处,还请海涵~更多爬虫主题参考我的专栏:
一. 调用Chrome浏览器

首先,假设通过Firefox()浏览器定向爬取CSDN首页导航栏信息,审查元素代码如下图所示,在div class="menu"路径的ul、li、a下,同时可以定位ul class="clearfix"。

python爬虫 Selenium切换窗口句柄及调用Chrome浏览器

代码如下所示:

# coding=utf-8 import os from selenium import webdriver #PhantomJS无界面浏览器 ##driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe") #打开火狐浏览器 driver = webdriver.Firefox() url = "" driver.get(url) #xpath路径定位导航栏 elem_dh = driver.find_elements_by_xpath("//div[@class='menu']/ul/li/a") for elem in elem_dh: print elem.text #获取正文 print elem.get_attribute('href') #获取属性值 然后转换成chrome浏览器,只需要在"C:\Program Files (x86)\Google\Chrome\Application\"路径下放置个chromedriver.exe驱动,再进行调用即可,代码如下所示: # coding=utf-8 import os from selenium import webdriver #PhantomJS无界面浏览器 ##driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe") #打开火狐浏览器 #driver = webdriver.Firefox() #谷歌浏览器 chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe" os.environ["webdriver.chrome.driver"] = chromedriver driver = webdriver.Chrome(chromedriver) #WebDriverException: Message: unknown error: session deleted because of page crash url = "" driver.get(url) #xpath路径定位导航栏 elem_dh = driver.find_elements_by_xpath("//div[@class='menu']/ul/li/a") for elem in elem_dh: print elem.text #获取正文 print elem.get_attribute('href') #获取属性值 print '\n' 运行结果如下图所示: >>> ==== RESTART ==== 知识库 学院 论坛 博客 下载 问答 商城 ITeye CODE https://code.csdn.net/ 活动 CTO 外包 程序员 APP >>> 二. 获取当前句柄并切换窗口句柄

在使用Selenium爬取知识过程,通常会遇到_blank弹出新窗体,或窗体是弹出的那种情况,而且有的需要登录,如:新浪微博、微信公众号、京东等,使用webdriver.Firefox()重新打开新窗体是无法加载已有信息的。这时候就需要通过获取当前句柄再进行窗口切换。
这里使用该方法实现获取CSDN导航栏的每条导航的标题信息,因为它是_blank弹出新窗体。需要注意每次窗口句柄移动都需要重新定位它们的主窗体。
核心代码:

#获取当前窗口句柄 now_handle = driver.current_window_handle print now_handle #获取所有窗口句柄 all_handles = driver.window_handles for handle in all_handles: if handle!=now_handle: #输出待选择的窗口句柄 print handle driver.switch_to_window(handle) time.sleep(1) #具体操作 elem_bt = driver.find_element_by_xpath("...") driver.close() #关闭当前窗口 #输出主窗口句柄 print now_handle driver.switch_to_window(now_handle) #返回主窗口

python爬虫 Selenium切换窗口句柄及调用Chrome浏览器


实例代码如下所示,它会依次打开每个导航栏,在爬取关闭。 # coding=utf-8 import os import time from selenium import webdriver #By:Eastmoun 2016-11-21 凌晨4:26 #打开火狐浏览器 driver = webdriver.Firefox() url = "" driver.get(url) #xpath路径定位导航栏 elem_dh = driver.find_elements_by_xpath("//div[@class='menu']/ul/li/a") #获取当前窗口句柄 now_handle = driver.current_window_handle print now_handle #循环获取界面 for elem in elem_dh: 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_sub = driver.find_element_by_xpath("//ul[@class='btns']/li/a") print elem_sub.text print elem_sub.get_attribute('href') print '' #关闭当前窗口 driver.close() #输出主窗口句柄 print now_handle driver.switch_to_window(now_handle) #返回主窗口 开始下一个跳转

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:黄冈网站建设 http://huanggang.45qun.com