孤荷凌寒自学python第八十六天对selenium模块进行较详细的了解

(今天由于文中所阐述的原因没有进行屏幕录屏,见谅)

为了能够使用selenium模块进行真正的操作,今天主要大范围搜索资料进行对selenium模块的学习,并且借2019年的新年好运居然在今天就来了,还在学习Python的过程中就接到一个任务,完成了第一个真正有实用价值的作品,大大增强了信心,也对Python爬取内容,操纵网页的能力有了真切的体会。

一、首先真诚感谢以下文章作者的无私分享:

查找到html页面标签对象方法的参考

https://www.cnblogs.com/zhuque/p/8321481.html

https://blog.csdn.net/u012941152/article/details/83011110

https://blog.csdn.net/bananasssss/article/details/51316369

下面这篇博主总结得非常全面,非常感激:

http://www.cnblogs.com/yufeihlf/p/5717291.html

下面这篇着重讲解了,Xpath语法下的定位方法:

http://www.cnblogs.com/qq78292959/archive/2013/08/26/3283714.html

二、selenium模块最常用的对象

from selenium import webdriver

webdriver是浏览器对象的总类,在它的下面直接对接火狐浏览器接口与谷歌浏览器接口。

因此最常用的类是:

webdriver.Firefox

通过webdriver.Firefox类的初始化方法就可以得到一个火狐浏览器对象,这可是真正对应了一个在桌面上可见的浏览器界面哦。

webdriver.Firefox类的初始化方法可以不需要任何实参,也可以传递一个指明昨天下载后放到浏览器安装目录的

geckodriver.exe

对象的路径。

如我的练习代码中的写法:

brower = webdriver.Firefox(executable_path=r'C:\Program Files\Mozilla Firefox\geckodriver.exe')

这样我就得到了一个火狐浏览器对象(webdriver浏览器对象):

brower

三、让浏览器自己加载一个页面地址

一般情况下让浏览器对象执行

get(要打开的页面url)

方法就可以让浏览器自动加载指定的页面内容。

四、webdriver浏览器对象怎么在已经打开的页面中找到具体的某个html标签对象

(以下内容根据下面地址的博文整理精简,感谢博主的无私分享)

http://www.cnblogs.com/yufeihlf/p/5717291.html

1.通过id定位元素

webdriver浏览器对象.find_element_by_id("html标签对象的ID字符串")

2.通过class_name定位元素

webdriver浏览器对象.find_element_by_class_name("css类名class值")

使用

 find_element_by_class_name

方法只返回找到的符合条件的第一个html标签对象

此时此Html对象的标准类别是(针对我使用的火狐浏览器):

selenium.webdriver.firefox.webelement.FirefoxWebElement

对象。

而使用

find_elements_by_class_name

方法得到的是所有符合条件的html标签对象的一个List(列表)对象。

3.通过tag_name定位元素(如:a div  p 等)

webdriver浏览器对象.find_elements_by_tag_name("html标签类别名")

4.通过name定位元素

webdriver浏览器对象.find_elements_by_tag_name("html标签类别名")

5.通过link文字精确定位元素

webdriver浏览器对象.find_element_by_link_text("a标签的内含文本的全部")

6.通过link文字模糊定位元素

webdriver浏览器对象.find_element_by_link_text("a标签的内含文本的部分内容")

7.通过CSS定位元素

webdriver浏览器对象.find_element_by_css_selector("CSS标识名")

7.1通过id属性定位元素

#号表示通过id属性来定位元素

find_element_by_css_selector("#kw")

7.2通过class属性定位元素

.号表示通过class属性来定位元素

find_element_by_css_selector(".s_ipt")

7.3通过标签名定位元素

find_element_by_css_selector("input")

7.4通过属性定位元素(挺常用的)

find_element_by_css_selector("[name='wd']")

find_element_by_css_selector("[maxlength='255']")

属性值包含某个值

属性值包含wd:适用于由空格分隔的属性值。

find_element_by_css_selector("[name~='wd']")

7.5父子定位元素

查找有父亲元素的标签名为span,它的所有标签名叫input的子元素

find_element_by_css_selector("span>input")

7.6组合定位元素

(1)标签名#id属性值:指的是该input标签下id属性为kw的元素

find_element_by_css_selector("input#kw")

(2)标签名.class属性值:指的是该input标签下class属性为s_ipt的元素

find_element_by_css_selector("input.s_ipt")

(3)标签名[属性=’属性值‘]:指的是该input标签下name属性为wd的元素

find_element_by_css_selector("input[name='wd']")

(4)父元素标签名>标签名.class属性值:指的是span下的input标签下class属性为s_ipt的元素

find_element_by_css_selector("span>input.s_ipt")

(5)多个属性组合定位元素

指的是input标签下id属性为kw且name属性为wd的元素

find_element_by_css_selector("input.s_ipt[name='wd']")

指的是input标签下name属性为wd且maxlength为255的元素

find_element_by_css_selector("input[name='wd'][maxlength='255']")

8.通过XPath定位元素

webdriver浏览器对象.find_element_by_xpath("XPath语句")

8.1通过属性定位元素

find_element_by_xpath("//标签名[@属性='属性值']")

(1)id属性:

find_element_by_xpath("//input[@id='kw']")

(2)class属性:

find_element_by_xpath("//input[@class='s_ipt']")

(3)name属性:

find_element_by_xpath("//input[@name='wd']")

(4)maxlength属性:

find_element_by_xpath("//input[@maxlength='255']")

8.2通过标签名定位元素

find_elements_by_xpath("//input")

上面的例子表示将找出使用的input标签。

8.3父子定位元素

如:查找有父亲元素的标签名为span,它的所有标签名叫input的子元素

find_element_by_xpath("//span/input")

8.4根据元素内容定位元素

如下面的例子:

find_element_by_xpath("//p[contains(text(),'个人主页')]")

再如下面的xpath语句

//input[contains(@class,'s')]

将找到一个class属性包含s的html标签的对象。

8.5组合定位元素

(1)find_element_by_xpath("//span/input[@class='s_ipt']")

//父元素标签名/标签名的属性值

指的是span下的input标签下class属性为s_ipt的html标签对象。

(2)多个属性组合定位(挺常用的)

find_element_by_xpath("//input[@class='s_ipt' and @name='wd']")

指的是input标签下id属性为kw且name属性为wd的html标签对象。

find_element_by_xpath("//p[contains(text(),'个人主页') and @id='myid']")

指的是p标签下内容包含“个人主页”且id属性为myid的html标签对象。

二、然后今天开始完成昨天接手的一个任务,也算是我学Python以来第一个要求以Python来完成的任务。

本来过去业余做过威客相当一段时间,感觉用时间与精力去换取微薄的金钱,其实迷失了自我,已经许久未曾接过活了。况且自己也还在初学阶段,可是这位朋友坚称我目前的能力可以帮他完成,还可以帮他节约不少钱,也提醒我顺便自己练练手,实践下,于是我只好不弗好意,硬着头皮来实践了一下。

其实最开始看到要求及对要模拟操作并爬取相关信息的网页内容还是感觉相当让我为难的——

首先要处理的多个网页,所有html源码的所有元素都没有固定的Id属性值,所有元素要么没有id属性,要么也是临时生成的id属性值,页面一刷新就全部改变;

第二,居然没有使用任何一个a标签,意味着它的所有二级三级……页面都是临时生成的,页面地址都是临时生成的,而且全部由混乱化的Js代码和ajax技术来控制页面跳转,用的不是a标签这种链接,居然全部使用div标签。

第三,用来代替a标签功能的div标签中并没有任何onclick这样的事件属性代码,很显然全部控制都在Js代码中。

第四,几乎所有的div标签都具有完全一致的属性特征,由于内含文本(innertext)多数时候是临时从数据库中加载的,不具有识别任何html标签元素的意义。

第五,直接查看到的任何一个页面的html源代码与实际显示的页面内容完全没有关系,很显然是使用的ajax之类的技术延迟加载的。

第六,后来发现页面大量使用了iframe框架,而且最多的有十层iframe嵌套那么多,我曾经用asp.net写过复杂 的网站,见到这种局面只能感慨写网页的人实在是有意而为之。

第七,客户强调,本身网页平台就严格防范由程序自动模拟操作,因此,打开任何一个页面后必须 要有页面点击,页面滚动,键盘动作等,才会视为有效操作。

第八,不能重复看任何内容,每个页面内容只能加载一次,并且必须随机化(这完全无法理解的什么游戏规则哈)。

第九,页面上的视频播放会自动隔段随机时间就中断播放,以检测是否人真的还在看。

……

然而客户再三要求,我不得已只好试试,最开始都不敢收预付金,决定要做做,真的要考验一下自己86天来的全部所学,也考验下Python的能力是否真的名不虚传。

我其实怀着能做到哪个程度就做到哪个程度的心情开始了操作,然而最后,经过近五个小时的努力,最终发现selenium模块的力量真的是无穷!!

仅仅靠着selenium模块与sb4模块的协助,居然python轻松就搞定当初看起来完全不可能的操作,这下我完全把Python视为了神一般的存在了。

不过由于这位客户朋友的再三强调,我就既不能将学习过程录屏分享出来 ,甚至也不能分享任何代码过程。这似乎也违反了我完全分享,全面分享的初衷,不过收了别人钱钱,看在人民币的份上,就只好如此啦,对不住大家。

能够在学习阶段就见识到Python的强大力场,竟然还可以有四位数以上意外收入的惊喜,让我对学习好Python有了更大的梦想。

三、拿到学Python后的第一笔收益后,我准备从明天起给自己放假

感谢这学习86天来,朋友们的热心帮助,真诚鼓励,没有大家的鼓励,也许我并不能坚持这么久,谢谢你们。

从零开始转学Python的初学阶段就此宣告结束,我将进行一段时间的休整,并利用寒假假期教孩子一起学习研究scratch与mixly。

此后,我将继续学习并与大家一起分享第二阶段自学Python的的全部过程。

祝大家春节快乐!猪年大吉!

——————————

今天整理的学习笔记完成,最后例行说明下我的自学思路:

根据过去多年我自学各种编程语言的经历,认为只有真正体验式,解决实际问题式的学习才会有真正的效果,即让学习实际发生。在2004年的时候我开始在一个乡村小学自学电脑 并学习vb6编程语言,没有学习同伴,也没有高师在上,甚至电脑都是孤岛(乡村那时还没有网络),有的只是一本旧书,在痛苦的自学摸索中,我找到适应自己零基础的学习方法:首先是每读书的一小节就作相应的手写笔记,第二步就是上机测试每一个笔记内容是否实现,其中会发现书中讲的其实有出入或错误,第三步就是在上机测试之后,将笔记改为电子版,形成最终的修订好的正确无误的学习笔记 。

通过反复尝试错误,在那个没有分享与交流的黑暗时期我摸黑学会了VB6,尔后接触了其它语言,也曾听过付费视频课程,结果发现也许自己学历果然太低,就算是零基础的入门课程,其实也难以跟上进度,讲师的教学多数出现对初学者的实际情况并不了解的情况,况且学习者的个体也存在差异呢?当然更可怕的是收费课程的价格往往是自己难以承受的。

于是我的所有编程学习都改为了自学,继续自己的三步学习笔记法的学习之路。

当然自学的最大问题是会走那么多的弯路,没有导师直接输入式的教学来得直接,好在网络给我们带来无限搜索的机会,大家在网络上的学习日志带给我们共享交流的机会,而QQ群等交流平台、网络社区的成立,我们可以一起自学,互相批评交流,也可以获得更有效,更自主的自学成果。

于是我以人生已过半的年龄,决定继续我的编程自学之路,开始学习python,只希望与大家共同交流,一个人的独行是可怕的,只有一群人的共同前进才是有希望的。

诚挚期待您的交流分享批评指点!欢迎联系我加入从零开始的自学联盟。

这个时代互联网成为了一种基础设施的存在,于是本来在孤独学习之路上的我们变得不再孤独,因为网络就是一个新的客厅,我们时刻都可以进行沙龙活动。

非常乐意能与大家一起交流自己自学心得和发现,更希望大家能够对我学习过程中的错误给予指点——是的,这样我就能有许多免费的高师了——这也是分享时代,社区时代带来的好福利,我相信大家会的,是吧!

喜马拉雅语音笔记:
https://www.ximalaya.com/keji/19103006/157532027

孤荷凌寒自学python第八十六天对selenium模块进行较详细的了解的更多相关文章

  1. 孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1

    孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案 ...

  2. 孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块

    孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块 (完整学习过程屏幕记录视频地址在文末) 由于本身tesseract模块针对普通的验证码图片的识别率并不高 ...

  3. 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10

    孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...

  4. 孤荷凌寒自学python第七十六天开始写Python的第一个爬虫6

    孤荷凌寒自学python第七十六天开始写Python的第一个爬虫6 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 不过由于对python-docx模 ...

  5. 孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5

    孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongo ...

  6. 孤荷凌寒自学python第五十六天通过compass客户端和mongodb shell 命令来连接远端MongoDb数据库

    孤荷凌寒自学python第五十六天通过compass客户端和mongodb shell 命令来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第二 ...

  7. 孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类尝试第一天

     孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类,尝试第一天 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 按上一天的规划,这是根据过去我自学其它编程语 ...

  8. 孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境

    孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境 (完整学习过程屏幕记录视频地址在文末) 学习Python我肯定不会错过图片文字的识别,当然更重要的是简单的验证码识别了,今天 ...

  9. 孤荷凌寒自学python第八十二天学习爬取图片2

    孤荷凌寒自学python第八十二天学习爬取图片2 (完整学习过程屏幕记录视频地址在文末) 今天在昨天基本尝试成功的基础上,继续完善了文字和图片的同时爬取并存放在word文档中. 一.我准备爬取一个有文 ...

随机推荐

  1. 时钟晶振32.768KHz为什么是15分频?

    实时时钟晶振为什么选择是32768Hz的晶振,在百度上搜索的话大部分的答案都是说2的15次方是32768,使用这个频率的晶振,人们可以很容易的通过分频电路得到1Hz的计时脉冲.但是话有说回来了,2的整 ...

  2. UCOS阅读问题累积

    1.#ifdef __cplusplus   extern "C" {  #endif 作用: 一般用于将C++代码以标准C形式输出(即以C的形式被调用),这是因为C++虽然常被认 ...

  3. IOS 文件名获取简洁方式

    //这里有一个模拟器沙盒路径(完整路径) NSString* index=@"/Users/junzoo/Library/Application Support/iPhone Simulat ...

  4. iOS 文件下载及断点续传

    ios的下载我们可以使用的方法有:NSData.NSURLConnection.NSURLSession还有第三方框架AFNetworking和ASI 利用NSData方法和NSURLConnecti ...

  5. Git 远程推送被拒绝的一种解决方案

    今天在推送的时候发生了如下错误信息: error: 无法推送一些引用到 'https://gitee.com/von_w/demo_app.git'提示:更新被拒绝,因为您当前分支的最新提交落后于其对 ...

  6. 07JavaScript数据类型

    JavaScript 数据类型 值类型(基本类型):字符串(String).数字(Number).布尔(Boolean).对空(Null).未定义(Undefined).Symbol. 引用数据类型: ...

  7. 谈个人对avascript面向对象的理解

    javascript,不但是javascript或者是别的语音,大多数都有一句经典的话:一切皆对象. 下面谈谈我个人对面向对象的理解,为什么要用面向对象来写js,这话我思考了很久,最后得出的结论就是: ...

  8. JS实现继承 JavaScript

    JS实现继承 JavaScript 定义一个父类: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // ...

  9. js之广告

    涉及到offset等有关获取各种尺寸问题下 <!doctype html> <html lang="en"> <head> <meta c ...

  10. Redis(八):Redis的复制(Master/Slave)

    Redis的复制(Master/Slave)目录导航: 是什么 能干嘛 怎么玩 复制原理 哨兵模式(sentinel) 复制的缺点 是什么 官网 行话:也就是我们所说的主从复制,主机数据更新后根据配置 ...