selenium + firefox/chrome/phantomjs登陆之模拟点击

时间:2022-08-31 12:28:32

登陆之模拟点击

工具:python/java + selenium + firefox/chrome/phantomjs

(1)windows开发环境搭建

默认已经安装好了firefox

  • 安装pip

pip是一个python的软件包管理工具,用于自动下载并安装、更新python
包,python3之后的某些版本已经自带pip,在python
2.7之前的话,需要自己安装,现在的安装方法已经非常简单,直接查看官方doc:http://pip.readthedocs.org/en
/stable/installing/,下载get-pip.py并执行python
get-pip.py即可一键安装。其他方法可参考《怎么在windows下安装pip》。为了便于使用,最好添加到系统变量PATH中。

  • 安装phantomjs

从官网下载windows版本的压缩包(http://phantomjs.org/download.html)。下载之后,直接解压到本地。建议使用最新版phantomjs-2.0.0-windows.zip,因为有些情况下phantomjs不能正确的解析仅仅是因为版本兼容性不好,这种bug基本无解,绕来绕去最终换过版本就好了。

  • 安装selenium

如果是python环境,安装好pip之后,直接使用

  1. pip install selenium
  2. pip install --upgrade selenium # 升级到最新版本

如果是java环境,下载一个完整的selenium-server-standalone-2.48.2.jar包即可,这个包很大,已经包含了所有依赖包和各种driver如(htmlunit driver之类的)

(2)linux(debian)开发环境搭建

  • 安装firefox

版权问题,debian自带的浏览器并不是firefox。如果想在debian环境下,使用firefoxDriver进行模拟点击,就必须先安装firefox。我在debian服务器上试了几种方法均失败,不过下面还是说一下找到的几种方法。

方法一:从firefox官网下载linux版之后,直接解压firefox

方法二:命令行安装。

参考

1.

  • libsqlite3-dev libfontconfig1-dev libicu-dev libfreetype6 libssl-dev \
  • libpng-dev libjpeg-dev python libx11-dev libxext-dev
  • b. 编译,大约需要半个小时,请耐心等待
  1. git clone git://github.com/ariya/phantomjs.git
  2. cd phantomjs
  3. git checkout 2.0
  4. ./build.sh

具体可参考phantomjs的官网:http://phantomjs.org/build.html

  • 安装selenium

跟windows一样简单,直接pip install selenium就搞定,前提是pip可用。

(3) selenium的使用介绍

selenium是一个自动化测试工具,支持多种编程语言java/python
/javascript/ruby/php/C#/perl。我们在爬虫中主要用于抓取动态页面时模拟浏览器行为,绕过后台执行js的复杂过程,用“所见
即所得”的方式进行页面点击、截屏、悬浮窗拖拽等。之前中文资料比较少,加上selenium
2.0和1.0巨大的区别,csdn上的中文博客大多不好使。刚搜了一下,好像有些中文社区和更正式一点的博客,感觉不错,先贴出来:

1. 《webDriver中文教程 & 中文社区》貌似是今年的,比较官方的样子,还没细看

2. 《Selenium Webdriver 简易教程

3.  官网的webdriver使用文档,也属于入门级别,有些复杂操作需要从其他有经验的使用者的博客里边略窥一二。

4.《The Selenium Browser Automation Project》介绍比较全面。

下面主要介绍一下可能遇到的坑,别人的经验可以参考《记录我遇到的使用selenium让人摸不着头脑的问题
》,下面是我碰过几次的

  • iframe & window

Selenium2(webdriver)在使用get(url)方法打开一个网页的时候,是不会继续加载里面的iframe中的页面源码,这与selenium 1的使用不同。当碰到有些元素不可选的时候,可以使用开发者工具查看是否有iframe元素。

  1. # 切换iframe
  2. driver.switch_to.frame("frameName") # 还有其他api
  3. # 切换window
  4. for handle in driver.window_handles:
  5. driver.switch_to.window(handle)
  • 不同的webdriver

官网已经有使用webdriver的优缺点的比较,例如firefox通常比ie快,而*面的HtmlUnitDriver通常会比firefox快,但对js的支持并不是那么好。并且不同driver对xpath语法的支持也不一样。

就个人使用经验来看,即便是同样的webdriver差别还是有点大的。例如在某些firefox的版本是可以抓取数据的,但在另外一些版本就不
行,selenium在这两年的演化过程中,中途出现过对最新firefox各种报错、但对老版本firefox就正常,以及对老phantomjs不能
抓取,最新版本phantomjs就OK的情况。当遇到各种很诡异的关于浏览器不能抓取问题的时候,需要考虑尝试不同的webdriver,以避开
selenium对个别型号的浏览器支持不良的情况。

  • 隐式等待与显示等待

当网页上有ajax等动态元素时,webdriver.get(url)只会等待html和js文件加载完成,但不一定会等待js生成的元素都出现在页面
源码中。使用xpath或者css选择器的时候,如果js产生的代码没有加载完成,就会报错,这种我们用开发者工具能发现的元素,但webdriver找
不到的情况,通常都是因为等待时间不够造成的。通常有两种方法:

第一种隐式等待,优点是想法简单,缺点是不同的页面需要的加载时间不同,为了保证数据正确,需要取一个最大的等待时间,拖慢代码执行效率。python中的源码如下

  1. <span style="font-size:12px;"># 每次获取页面都设置10秒钟的超时时间</span>

driver.implicitly_wait(10)

第二种是显示等待。用于指定等待到页面加载到某些为真的可控条件,例如出现某个元素之后,就认为需要的页面内容已经加载完成了,python代码如下:

  1. <span style="font-size:12px;"># 构建WebDriverWait,设置最大超时时间是30秒</span>

wait = WebDriverWait(driver, 30)

  1. <span style="font-size:12px;"># 等待页面出现id=authFrame的元素出现,一旦出现就进入下一步</span>

wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'authFrame')))

关于数据等待可以参考:《如何等待页面元素加载完成》java实现,同时举了个需要页面等待的栗子。

(4)itunes登陆的代码示例

一切不上代码的演示都是耍流氓。

  1. import selenium,platform
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  5. from selenium.common.exceptions import TimeoutException
  6. from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
  7. from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
  8. from selenium.webdriver.common.by import By
  9. driverPath = '/home/phantomjs/bin/phantomjs'
  10. if platform.system()=='Windows':
  11. driverPath = 'D:/python_tool/phantomjs-2.0.0-windows/bin/phantomjs.exe'
  12. #         driver = webdriver.PhantomJS(executable_path=driverPath) #使用phantomJs进行驱动
  13. driver = webdriver.Firefox() #使用FireFox进行模拟点击,运行此段代码的时候,会启动firefox
  14. url = 'https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa' # itunes登陆页面
  15. driver.get(url) # 跟浏览器一样加载页面
  16. #        driver.implicitly_wait(10) #每次加载页面的时候等待10秒钟
  17. wait = WebDriverWait(driver, 30) # 页面加载时间可能比较长
  18. try: # 等待页面加载完成
  19. wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'authFrame'))) # 等待出现id为authFrame的元素载入完成
  20. wait.until(EC.element_to_be_clickable((By.ID,'appleId'))) # 等待出现id为appId的元素可以点击
  21. print driver.title
  22. except:
  23. print 'error'*20
  24. driver.quit()
  25. # 输入账号、密码并点击提交
  26. driver.find_element_by_id('appleId').send_keys(self.account)
  27. driver.find_element_by_id('pwd').send_keys(self.password)
  28. driver.find_element_by_id('sign-in').click()
  29. # 显示等待一段页面跳转
  30. time.sleep(5)
  31. print '---  login success  ----'
  32. #print driver.get_cookies()#打印cookie
  33. for cookie in driver.get_cookies():
  34. print "%s -> %s" % (cookie['name'], cookie['value'])
  35. return

如果想访问别的数据页面,可以driver.get(url)和click方法逐步访问、点击。这个效率会比较低,selenium也可以使用多线程操作,但selenium并不保证多线程的数据一致性,简单的讲对多线程的支持不是很好。

selenium + firefox/chrome/phantomjs登陆之模拟点击的更多相关文章

  1. Python selenium&period;webdriver&period;chrome&period;options&period;Options&lpar;&rpar; Examples

    The following are 27 code examples for showing how to use selenium.webdriver.chrome.options.Options( ...

  2. selenium设置chrome和phantomjs的请求头信息

    selenium设置chrome和phantomjs的请求头信息   出于反爬虫也好-跳转到手机端页面也好都需要设置请求头,那么如何进行呢? 目录 一:selenium设置phantomjs请求头: ...

  3. 爬虫之动态HTML处理(Selenium与PhantomJS )网站模拟登录

    #coding=utf-8from selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport tim ...

  4. 利用selenium库自动执行滑动验证码模拟登陆

    破解流程 #1.输入账号.密码,然后点击登陆 #2.点击按钮,弹出没有缺口的图 #3.针对没有缺口的图片进行截图 #4.点击滑动按钮,弹出有缺口的图 #5.针对有缺口的图片进行截图 #6.对比两张图片 ...

  5. selenium webdriver 启动三大浏览器Firefox&comma;Chrome&comma;IE

    selenium webdriver 启动三大浏览器Firefox,Chrome,IE 1.安装selenium 在联网的情况下,在Windows命令行(cmd)输入pip install selen ...

  6. linux安装selenium&plus;chrome&plus;phantomjs

    1. 安装 selenium pip3 install selenium pip3 安装参考 2. 安装 ChromeDriver yum install chromedriver.x86_64 3. ...

  7. 爬虫之动态HTML处理(Selenium与PhantomJS )动态页面模拟点击

    动态页面模拟点击 #!/usr/bin/env python # -*- coding:utf-8 -*- # python的测试模块 import unittest from selenium im ...

  8. Centos 7&period;6 安装selenium&plus;firefox&plus;google chrome(支持xshell运行)

    1. 查看Linux 版本 [root@penguin selenium]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) ...

  9. Selenium&plus;Chrome&plus;PhantomJS 爬取淘宝

    https://github.com/factsbenchmarks/taobao-jingdong 一 简单铺垫 Selenium负责驱动浏览器与python对接 PhantomJS负责渲染解析Ja ...

随机推荐

  1. 6&period;Linux的文件权限与目录配置

    Linux文件属性:(- rwx r-x r-- 1 root root 2800 feb 1 11:55 test.txt 顺序按着空格排序,除了时间) 第一组字符代表这个文件是目录.文件或链接文件 ...

  2. http&colon;&sol;&sol;zh&period;lucida&period;me&sol;

    一个很厉害的在美国Google的学长的博客

  3. PS技能大全

    1.设置固定的图片大小 参考:http://jingyan.baidu.com/album/642c9d3418bec4644a46f72a.html?picindex=1

  4. ueditor &period;net版本上传不了图片问题

    百度的Ueditor适合中国人,所以,选择了它,可是恶梦才刚刚开始,最头痛的就是图片死活就是上传不成功,悲剧中.. 现在来分析下为什么报错:什么也不说了,上图

  5. InnoDB主键设计

    InnoDB是clustered-index table,因此对于InnoDB而言,主键具有特殊意义. 可以通过主键直接定位到对应的某一数据行记录的物理位置,主键索引指向对应行记录,其他索引则都指向主 ...

  6. web api同源策略

    1.重写JsonMediaTypeFormatter public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter { private s ...

  7. Oracle数据库多语言文字存储解决方案

    一.关于字符集 字符集(也称字元集,Character Set)就是字符编码表(codepage),一个字符不论英文.中文.韩文等在计算机系统内存或硬盘中通过二进制的字节(Byte)保存,这个二进制的 ...

  8. Hadoop初步认识

    Hadoop的介绍: Hadoop是一个适用于大数据的并行存储和计算的平台,是 Apache的一个用java 语言实现开源软件框架,实现了在大量计算机组成的集群中对海量数据进行分布式计算.Hadoop ...

  9. Label设置行间距--b

    内容摘要 UILabel显示多行文本 UILabel设置行间距 解决单行文本 & 多行文本显示的问题 场景描述 众所周知,UILabel显示多行的话,默认行间距为0,但实际开发中,如果显示多行 ...

  10. TypeScript设计模式之组合、享元

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...