python网络爬虫系列教程——Python+PhantomJS +Selenium组合应用
来源:互联网 发布:linux改用户名命令 编辑:程序博客网 时间:2024/06/07 16:30
全栈工程师开发手册 (作者:栾鹏)
python教程全解
Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器。
理解Selenium很简单,平时我们使用的获取网页,都是获取一个文件,或者响应文件流,因为json本身也是通过xml文件流来传输的。而Selenium创建的是一个浏览器驱动。会自动执行网页中的内容,包括js代码,ajax请求,而这些操作又会自动改变修改这个浏览器驱动包含的网页内容。这个浏览器驱动相当于在网上右键审查元素(检查)看到的内容。
Selenium有以下功能:
框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
Selenium支持多种语言开发,比如python、 Java,C,Ruby等等。
一般情况我们使用Python+Selenium+PhantomJS 这个组合。PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与 Python 的对接,Python 进行后期的处理,完美的三剑客!
安装
安装PhantomJS ,参考http://blog.csdn.net/luanpeng825485697/article/details/78428696
安装selenium,在cmd中输入pip install selenium即可实现在线安装。
或者离线下载(点击下载),再安装(安装教程)
python2.7和python3.6下
# -*- coding:utf-8 -*-#python+selenium+PhantomJS 无视图的浏览器处理。高效处理模拟js功能from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.ui import Selectfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport timedriver = webdriver.PhantomJS(executable_path='C:\Python27\Scripts\phantomjs.exe') #使用PhantomJS这个浏览器来作为js处理器driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html") #请求指定网址。所以的js反应会自动修改driver,所以不同时间访问driver会有不同的效果#隐式等待(等待特定的时间)time.sleep(3) #等待页面中的初始化js函数和初始化ajax函数完成。如果这里时间短,则下面的driver内容会不一样。# driver.implicitly_wait(3) # seconds#显示等待,等待指定条件结束driver.get("http://somedomain/url_that_delays_loading")try: element = WebDriverWait(driver, 10).until( #10为超时时间 EC.presence_of_element_located((By.ID, "myDynamicElement")) #程序默认会 500ms 调用一次来查看元素是否已经生成,如果本来元素就是存在的,那么会立即返回。 #以下是内置的等待条件 # title_is # title_contains # presence_of_element_located # visibility_of_element_located # visibility_of # presence_of_all_elements_located # text_to_be_present_in_element # text_to_be_present_in_element_value # frame_to_be_available_and_switch_to_it # invisibility_of_element_located # element_to_be_clickable – it is Displayed and Enabled. # staleness_of # element_to_be_selected # element_located_to_be_selected # element_selection_state_to_be # element_located_selection_state_to_be # alert_is_present )finally: driver.quit()html = driver.page_source #获取页面执行后的网页源代码(初始化js和初始化ajax执行结束后的源代码,即谷歌中审查元素的网页源代码)print(html)#获取元素、元素列表element = driver.find_element_by_css_selector('#content') #根据css选择器获取元素element = driver.find_element_by_tag_name("div") #根据标签名称获取元素element = driver.find_element_by_name("passwd") #根据名称选择element = driver.find_element_by_xpath("//input[@id='passwd-id']") #根据路径表达式选择element = driver.find_element_by_class_name('class1') #根据样式类选择元素element = driver.find_element_by_id('content') #根据id获取元素elements = driver.find_elements_by_css_selector("div") #find_elements获取元素列表#通过by类来实现选择driver.find_element(By.XPATH, '//button[text()="Some text"]')driver.find_elements(By.XPATH, '//button')# ID = "id"# XPATH = "xpath"# LINK_TEXT = "link text"# PARTIAL_LINK_TEXT = "partial link text"# NAME = "name"# TAG_NAME = "tag name"# CLASS_NAME = "class name"# CSS_SELECTOR = "css selector"#selsect选择元素select = Select(driver.find_element_by_name('name')) #根据查找到的select元素,构建Select对象select.select_by_index(1) #根据索引来选择select.select_by_visible_text("text") #根据值来选择select.select_by_value("value1") #根据文字来选择select.deselect_all() #全部取消选择all_selected_options = select.all_selected_options #获取所有的已选选项options = select.options #获取所有可选选项#元素属性element.get_attribute("value") #元素属性element.text #元素文本#模拟操作element.send_keys("some text") #追加填入文本element.send_keys("and some", Keys.ARROW_DOWN) #点击按键element.clear() #清除文本element.click() #模拟点击element.submit() #提交元素提交#元素拖拽element = driver.find_element_by_name("source")target = driver.find_element_by_name("target")from selenium.webdriver import ActionChainsaction_chains = ActionChains(driver)action_chains.drag_and_drop(element, target).perform()# 页面切换driver.switch_to.window("windowName") #切换到指定名称的窗口for handle in driver.window_handles: #遍历窗口对象 driver.switch_to.window(handle) #切换到窗口对象driver.switch_to.frame("frameName.0.child") #切换到指定名称的fragme,焦点会切换到一个 name 为 child 的 frame 上# 弹窗处理alert = driver.switch_to.alert() #获取弹窗对象# 历史记录driver.forward() #页面前进driver.back() #页面后退# Cookies处理cookie = {'name' : 'foo', 'value' : 'bar'} #使用字典定义cookie的值driver.add_cookie(cookie) #设置cookiedriver.get_cookies() #读取cookiedriver.close()
- python网络爬虫系列教程——Python+PhantomJS +Selenium组合应用
- python网络爬虫系列教程——PhantomJS包应用全解
- Python爬虫之Selenium+PhantomJS组合
- Python爬虫利器Selenium+PhantomJS系列入门
- phantomjs+selenium+python爬虫
- Selenium+Chrome(PhantomJs) Python爬虫
- Python爬虫Selenium和PhantomJS系列之十三
- python网络爬虫系列教程——python中BeautifulSoup4库应用全解
- python网络爬虫系列教程——python中urllib、urllib2、cookie模块应用全解
- python网络爬虫系列教程——python中requests库应用全解
- python网络爬虫系列教程——python中pyquery库应用全解
- [python爬虫]selenium+PhantomJS模拟登陆
- selenium+python+phantomjs爬虫博客排行榜
- selenium + phantomjs+python 外网动态爬虫
- python+selenium+phantomjs实现爬虫功能
- python网络爬虫系列教程——Scrapy框架应用全解
- python网络爬虫系列教程——python中lxml库应用全解(xpath表达式)
- python网络爬虫系列教程——python网络数据爬虫误区,让你的爬虫更像人类
- 数据结构与算法3:链表1
- wireshark找不到捕获接口问题的解决办法
- 图的广度优先遍历(链式前向星)
- 深究递归和迭代的区别、联系、优缺点及实例对比
- 数据结构-树与二叉树
- python网络爬虫系列教程——Python+PhantomJS +Selenium组合应用
- PHP连接和拆分数组array_combine()和array_slice()用法示例
- 2017年11月3日博客开通随笔
- Essential Studio for Xamarin更新至2017 v3版本,增加新的选择器控件丨附下载
- 2017.11.3 树上期望DP 解题报告
- 使用Merge引擎
- 添加购物车弧形动画
- git学习之:eclipse项目提交到gitHub
- Retrofit联网报错:Retrofit: Invalid % sequence at XXXX的解决方法