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()
阅读全文
1 0
原创粉丝点击