selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器

在爬虫中的应用主要是用来解决JS渲染的问题。

1.使用前需要安装这个第三方库,CMD下:

pip install selenium

2.为你的测试浏览器下载驱动,我用的是Chrome,对应的去百度一下Chrome webdrive下载,并解压到python安装目录scripts下。

开始使用

  1. from selenium import webdrive
  2.  
  3. browser = webdrive.Chrome()
  4. browser.get('http://www.baidu.com')

运行代码就会弹出一个Chrome浏览器,并执行了一个get请求到达了百度。

如果是像微博这样的页面经过大量JS代码渲染过的,仅仅使用requests来打印页面源码,看到的时很简单的html和少量JS代码,这就获取不了我们需要的内容

所以,selenium解决了这个问题,通过模拟浏览器的访问,实现了页面源码的完整打印

  1. from selenium import webdrive
  2.  
  3. browser = webdrive.Chrome()
  4. browser.get('https://www.zhihu.com/explore')
  5. print(browser.page_source)
    browser.close() #源码打印后,可以选择自动关闭或者手动关闭

这样的话,页面完全加载后,源码全部打印。

元素查找

单个元素查找

查找方法有以下七种:

find_element_by_name

find_element_by_xpath

find_element_by_link_text

find_element_by_partial_link_text

find_element_by_tag_name

find_element_by_class_name

find_element_by_css_selector

以淘宝作为示例,下面是淘宝输入框的html代码

  1. <input id="q" name="q" aria-label="请输入搜索文字" accesskey="s" autofocus="autofocus" autocomplete="off" class="search-combobox-input" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate" tabindex="0">

其中id为q

使用三种方式进行查找

  1. from selenium import webdriver
  2.  
  3. browser = webdriver.Chrome()
    browser.get('http://www.taobao.com')
  4.  
  5. input_first = browser.find_element_by_id('q')
  6. input_sec = browser.find_element_by_css_selector('#q') #在进行css选择时,class以#代替
  7. input_third = browser.find_element_by_xpath('//*[@id="q"]')
  8. print(input_first, input_sec, input_third)

输出信息:可以看到三者的element值全部相同

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

另一种查找方式:

这种查找方式无非就是将查找方式作为参数传入,相比还是上一种更简洁

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3.  
  4. browser = webdriver.Chrome()
  5. browser.get('http://www.taobao.com')
  6. input_fir = browser.find_element(By.ID, 'q')
  7. input_sec = browser.find_element(By.CSS_SELECTOR, '#q')
  8. input_thi = browser.find_element(By.XPATH, '//*[@id="q"]')
  9. print(input_fir, input_sec, input_thi)

输出:三者的element值还是相同的

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

多元素查找

find_elements_by_xxx,find_elements(By.xxxxx)

淘宝元素查找示例,服务导航条的html代码如下

  1. <ul class="service-bd" role="menubar">
  2. <li data-closeper="" aria-label="查看更多" role="menuitem" aria-haspopup="true" data-groupid="101" class="J_Cat a-all">

查找service-bd下级的li标签

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3.  
  4. browser = webdriver.Chrome()
  5. browser.get('http://www.taobao.com')
  6. a = browser.find_elements_by_css_selector('.service-bd li')
  7. # b = browser.find_elements(By.CSS_SELECTOR, '.service-bd li') #第二种的参数传入查找方式
  8.  
  9. print(a)

结果:li标签的值仍然是相同的,多元素查找时,返回的时list集合

[<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-1")>,

<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-2")>,

<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-3")>,

.......]

元素交互操作

由网页get--->>>元素查找---->>>键值插入及删除--->>>点击事件

以下代码实现的过程是:到达淘宝--->>>查找输入框id为q的元素--->>>键入值---等待---重新键入值-----提交按钮元素查找---点击

  1. from selenium import webdriver
  2. import time
  3.  
  4. browser = webdriver.Chrome()
  5. browser.get('http://www.taobao.com')
  6. input = browser.find_element_by_id('q')
  7. input.send_keys('iPhone')
  8. time.sleep(2)
  9. input.clear()
  10. input.send_keys('gigabyte')
  11. button = browser.find_element_by_class_name('btn-search')
  12. button.click()
  13. print(browser.current_url) # 打印当前页面的url

执行JS语句

  1. from selenium import webdriver
  2.  
  3. #执行js语句:实现一个网页下拉动作
  4. browser = webdriver.Chrome()
  5. browser.get('http://www.zhihu.com/explore')
  6. browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
  7. browser.execute_script('alert("succ")')

前进与后退操作

  1. >>> from selenium import webdriver
  2. >>> driver = webdriver.Chrome()
  3. >>> driver.get('http://www.baidu.com')
  4. >>> driver.get('http://www.sina.com')
  5. >>> driver.back()
  6. >>> driver.forward()

标签页的增加

  1. from selenium import webdriver
  2.  
  3. driver = webdriver.Chrome()
  4. driver.get('http://www.zhihu.com/explore')
  5. driver.execute_script('window.open()')
  6. print(driver.window_handles)
  7. driver.switch_to.window(driver.window_handles[0])
  8. driver.get('http://www.taobao.com')
  9. driver.switch_to.window(driver.window_handles[1])
  10. driver.get('http://m.weibo.com')
  11. driver.close()

今天博客园抽风了,截图上传不了...

我用selenium做了模拟登陆百度,不过验证码需要自己手打

验证码问题的解决需要依赖PIL库,我还没学习过。。

  1. from selenium import webdriver
  2. import time
  3.  
  4. #声明浏览器对象
  5. browser = webdriver.Chrome()
  6. browser.get('https://passport.baidu.com/v2/?login&fr=old&login&tpl=mn')
  7.  
  8. username = browser.find_element_by_id('TANGRAM__PSP_3__userName')
  9. username.send_keys('account')
  10.  
  11. password = browser.find_element_by_id('TANGRAM__PSP_3__password')
  12. password.send_keys('passwd')
  13. time.sleep(5)
  14.  
  15. button = browser.find_element_by_id('TANGRAM__PSP_3__submit')
  16. button.click()
  17.  
  18. # sendcode = browser.find_element_by_class_name('forceverify-button forceverify-button-send')
  19. # sendcode.click()
  20. #
  21. # time.sleep(10)
  22. #
  23. # finalogin = browser.find_element_by_id('TANGRAM__28__button_submit')
  24. # finalogin.click()

如果不需要显示的调用浏览器,可以使用第三方浏览器:PhantomJS

phantomjs介绍

(1)一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。

(2)提供javascript API接口,即通过编写js程序可以直接与webkit内核交互,在此之上可以结合java语言等,通过java调用js等相关操作,从而解决了以前c/c++才能比较好的基于webkit开发优质采集器的限制。

(3)提供windows、linux、mac等不同os的安装使用包,也就是说可以在不同平台上二次开发采集项目或是自动项目测试等工作。

Windows下安装使用:

pip install PhantomJS

用法

  1. from selenium import webdriver
  2.  
  3. browser = webdriver.PhantomJS()

只有声明浏览器对象时不同,其他用法全部相同

异常的捕获:

  1. http://selenium-python.readthedocs.io/index.html

python爬虫---selenium库的用法的更多相关文章

  1. Python爬虫-- selenium库

    selenium库 selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(S ...

  2. python爬虫---requests库的用法

    requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装 pip install requests 安装完成后import一下 ...

  3. Python爬虫Urllib库的高级用法

    Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...

  4. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...

  5. 安装python的selenium库和驱动

    对于使用selenium来进行python爬虫操作可以简化好多操作,它实际上的运行就是通过打开一个浏览器来一步一步的按照你的代码来执行 如果安装过python编译器后应该pip工具也是有的,验证pyt ...

  6. [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论

    前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...

  7. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  8. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...

  9. [python爬虫] Selenium常见元素定位方法和操作的学习介绍

    这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操作介绍,希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~同时CSDN总是屏蔽这篇文章,再加上最近 ...

随机推荐

  1. windows上传文件到linux云服务器上

    安装putty,将pscp.exe移到 C:\Windows\System32 目录下. 在cmd 中执行,pscp -l rot -pw [password] -ls [ip]:/opt 查看目录 ...

  2. Python第六章(北理国家精品课 嵩天等)

    一 1.集合类型定义及其操作: 集合用{}表示,元素用逗号分隔,无序,唯一 集合操作符: |:并 -:减 &:交 ^ :补 <= <:判断子集关系 >= >:判断包含关 ...

  3. 日积月累---JVM01

    Java体系结构包括四个独立但相关的技术: Java程序设计语言 Java class文件格式 Java应用编程接口 Java虚拟机 用Java编程语言编写源代码,把它编译成Java class文件, ...

  4. python 语法的一些特性记录

    装饰器@符号 装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象.它经常用于有切面需求的场景,比如:插入日志 ...

  5. python学习之路之int()奇怪的报错

    今天闲来无事看了下python基础知识,当学到数据类型转换的int()方法时候.发现了这么一个有意思的事情,算是IDE或是解释器的一个小BUG.(具体原因暂不明,留待以后查找问题) 先讲下环境 操作系 ...

  6. Linux常用命令之Yum

    Linux Yum命令详解Yum全称Yellow dog Updater,Modified,是一个在Fedora和RedHat以及SUSE中提供的基于RPM包的软件包管理工具,能够从指定的服务器自动下 ...

  7. Python 语法2

    文档字符串,这个只能是用于紧跟函数第二行的内容. 输出文档说明的部分,代码格式是 函数名称.(dot)__(双下划线)doc__(双下划线) ///////////////////////////// ...

  8. Linux下MySQL在知道密码的情况下修改密码

    1.在知道原密码的情况下,进入MySQL: mysql -u root -p 2.进入 mysql数据库,然后通过语句修改密码: 我的MySQL版本是:mysql  Ver 14.14 Distrib ...

  9. java求最大值以及定义方法调用

    class ArrayDome { public static void main(String[] args) { int[] arr = {-12,-51,-12,-11}; int max = ...

  10. react-redux性能优化之reselect

    在React-redux深入理解中,我们知道了 react-redux 是如何将 React 和 Redux 进行连接的,今天来说一下其中存在的性能问题以及改进的方式. 一.存在的性能问题 以 Red ...