python网络爬虫系列教程——Python+PhantomJS +Selenium组合应用

全栈工程师开发手册 (作者:栾鹏)
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即可实现在线安装。

或者离线下载(点击下载),再安装(安装教程

首先我们将PhantomJS.exe存储在代码文件当前目录下。以便我们调用

python3.6下

# -*- coding:utf-8 -*-
#python+selenium+PhantomJS 无视图的浏览器处理。高效处理模拟js功能
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver = 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 ActionChains
action_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)  #设置cookie
driver.get_cookies()  #读取cookie


driver.close()

查找当前节点子节点方法

find_element_by_id                          在当前节点查找指定id的子节点
find_elements_by_id                        在当前节点查找指定id的子节点集
find_element_by_name                    在当前节点查找指定name的子节点
find_elements_by_name                  在当前节点查找指定name的子节点集
find_element_by_link_text                在当前节点查找指定链接文本的子节点
find_elements_by_link_text              在当前节点查找指定链接文本的子节点集
find_element_by_partial_link_text      在当前节点查找指定链接部分文本的子节点
find_elements_by_partial_link_text    在当前节点查找指定链接部分文的子节点集
find_element_by_tag_name                在当前节点查找指定html tag的子节点
find_elements_by_tag_name            在当前节点查找指定html tag的子节点集
find_element_by_xpath                      在当前节点查找指定xpath的子节点
find_elements_by_xpath                    在当前节点查找指定xpath的子节点集
find_element_by_class_name            在当前节点查找指定class name的子节点
find_elements_by_class_name          在当前节点查找指定class name的子节点集
find_element_by_css_selector            在当前节点查找指定css选择器的子节点
find_elements_by_css_selector          在当前节点查找指定css选择器的子节点集

当前元素操作

tag_name                      获取当前元素的tag name属性

text                                  获取当前元素的text内容

get_property                  获取当前元素指定属性值

get_attribute        获取当前元素指定属性值,注意请看源码,该方法与get_property的区别

is_selected            判断元素的选择状态(针对radio button和checkbox)

is_enabled            判断元素是否可用

send_keys            键盘输入(主要针对text、或text area 可接受键盘输入的元素)

is_displayed           判断元素是否可见

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯AI架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值