python爬虫---selenium库的用法
selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器
在爬虫中的应用主要是用来解决JS渲染的问题。
1.使用前需要安装这个第三方库,CMD下:
pip install selenium
2.为你的测试浏览器下载驱动,我用的是Chrome,对应的去百度一下Chrome webdrive下载,并解压到python安装目录scripts下。
开始使用
from selenium import webdrive browser = webdrive.Chrome()
browser.get('http://www.baidu.com')
运行代码就会弹出一个Chrome浏览器,并执行了一个get请求到达了百度。

如果是像微博这样的页面经过大量JS代码渲染过的,仅仅使用requests来打印页面源码,看到的时很简单的html和少量JS代码,这就获取不了我们需要的内容
所以,selenium解决了这个问题,通过模拟浏览器的访问,实现了页面源码的完整打印

from selenium import webdrive browser = webdrive.Chrome()
browser.get('https://www.zhihu.com/explore')
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代码
<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
使用三种方式进行查找

from selenium import webdriver browser = webdriver.Chrome()
browser.get('http://www.taobao.com') input_first = browser.find_element_by_id('q')
input_sec = browser.find_element_by_css_selector('#q') #在进行css选择时,class以#代替
input_third = browser.find_element_by_xpath('//*[@id="q"]')
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")>
另一种查找方式:
这种查找方式无非就是将查找方式作为参数传入,相比还是上一种更简洁

from selenium import webdriver
from selenium.webdriver.common.by import By browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
input_fir = browser.find_element(By.ID, 'q')
input_sec = browser.find_element(By.CSS_SELECTOR, '#q')
input_thi = browser.find_element(By.XPATH, '//*[@id="q"]')
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代码如下
<ul class="service-bd" role="menubar">
<li data-closeper="" aria-label="查看更多" role="menuitem" aria-haspopup="true" data-groupid="101" class="J_Cat a-all">
查找service-bd下级的li标签

from selenium import webdriver
from selenium.webdriver.common.by import By browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
a = browser.find_elements_by_css_selector('.service-bd li')
# b = browser.find_elements(By.CSS_SELECTOR, '.service-bd li') #第二种的参数传入查找方式 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的元素--->>>键入值---等待---重新键入值-----提交按钮元素查找---点击

from selenium import webdriver
import time browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(2)
input.clear()
input.send_keys('gigabyte')
button = browser.find_element_by_class_name('btn-search')
button.click()
print(browser.current_url) # 打印当前页面的url

执行JS语句

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

前进与后退操作

>>> from selenium import webdriver
>>> driver = webdriver.Chrome()
>>> driver.get('http://www.baidu.com')
>>> driver.get('http://www.sina.com')
>>> driver.back()
>>> driver.forward()

标签页的增加

from selenium import webdriver driver = webdriver.Chrome()
driver.get('http://www.zhihu.com/explore')
driver.execute_script('window.open()')
print(driver.window_handles)
driver.switch_to.window(driver.window_handles[0])
driver.get('http://www.taobao.com')
driver.switch_to.window(driver.window_handles[1])
driver.get('http://m.weibo.com')
driver.close()

今天博客园抽风了,截图上传不了...
我用selenium做了模拟登陆百度,不过验证码需要自己手打
验证码问题的解决需要依赖PIL库,我还没学习过。。

from selenium import webdriver
import time #声明浏览器对象
browser = webdriver.Chrome()
browser.get('https://passport.baidu.com/v2/?login&fr=old&login&tpl=mn') username = browser.find_element_by_id('TANGRAM__PSP_3__userName')
username.send_keys('account') password = browser.find_element_by_id('TANGRAM__PSP_3__password')
password.send_keys('passwd')
time.sleep(5) button = browser.find_element_by_id('TANGRAM__PSP_3__submit')
button.click() # sendcode = browser.find_element_by_class_name('forceverify-button forceverify-button-send')
# sendcode.click()
#
# time.sleep(10)
#
# finalogin = browser.find_element_by_id('TANGRAM__28__button_submit')
# 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
用法
from selenium import webdriver browser = webdriver.PhantomJS()
只有声明浏览器对象时不同,其他用法全部相同
异常的捕获:
http://selenium-python.readthedocs.io/index.html
python爬虫---selenium库的用法的更多相关文章
- Python爬虫-- selenium库
selenium库 selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(S ...
- python爬虫---requests库的用法
requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装 pip install requests 安装完成后import一下 ...
- Python爬虫Urllib库的高级用法
Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...
- [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍
前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...
- 安装python的selenium库和驱动
对于使用selenium来进行python爬虫操作可以简化好多操作,它实际上的运行就是通过打开一个浏览器来一步一步的按照你的代码来执行 如果安装过python编译器后应该pip工具也是有的,验证pyt ...
- [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论
前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...
- [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒
前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...
- [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)
转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...
- [python爬虫] Selenium常见元素定位方法和操作的学习介绍
这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操作介绍,希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~同时CSDN总是屏蔽这篇文章,再加上最近 ...
随机推荐
- Vue语法学习第一课——插值
学习关于Vue的插值语法 ① 文本值 : "Mustache"语法,即双大括号 <span>Message:{{msg}}</span> 注:双大括号中的m ...
- APICloud-数据存储
APICloud 共有四种数据存储 1.file:目录操作,文件操作 文件存储方式,用于图片.文档的上传.下载.删除.管理. 2.db:本地 sqlite 数据库 用于离散数据的存储. 3.loacl ...
- Holer实现外网访问ARM嵌入式Linux系统
公网访问ARM嵌入式Linux系统 实验室里的ARM嵌入式Linux系统,只能在局域网内访问,怎样从公网也能访问内网ARM嵌入式Linux系统? 本文将介绍使用holer实现的具体步骤. 1. 准备工 ...
- lsmod语法
lsmod——显示已载入系统的模块 lsmod 其实就是list modules的缩写,即 列出所有模块. 功能说明:显示已载入系统的模块. 语法:lsmod 说明:执行lsmod指令,会列出所有已载 ...
- python 读取默认配置文件和用户配置文件 configs
优先从configs_default中读取配置,但是configs_override中的配置可以override它 import configs_default #import configs_ove ...
- linux虚拟机黑屏解决
最近电脑上的虚拟机点击开机就一直黑屏,几次了,挂起时能够看到显示,但是开机就黑屏. 百度了之后找到了解决方案:(我是第一种方案就解决了)(据说可能是wegame的锅,用来打lol的....) 方法1: ...
- D2 有关写博客新的体会以及面向对象
之前几篇博客一大堆废话,着实浪费时间也没啥实际作用.除了总结一些java的知识点外,再用一些比喻或者形象化的语言来表述这些知识点,无可厚非.但是,现在看来,应当减少这种堆满偏理论式偏方法性的内容的博客 ...
- vue插件
Vue.js提供了插件机制,可以在全局添加一些功能.它们可以简单到几个方法.属性,也可以很复杂,比如一整套组件库. 注册插件需要一个公开的方法install,它的第一个参数是Vue构造器,第二个参数是 ...
- USB接口禁用与启用
前几天闺蜜淘了一台小本,但是发现计算机USB接口是禁用的,有点头疼,所以问了万能的度娘,找到了n种办法.不过这一种是适用于我的情况,简单记录一下. 解决方法:(主要就是修改注册表) 1.打开注册表编辑 ...
- Python:从入门到实践--第六章--字典--练习
#1.人:使用一个字典来存储一个熟人的信息;包括姓,名,年龄和居住的城市.将字典中的每项信息都打印出来 friend = { 'last_name':'马', 'first_name':'脑壳', ' ...