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

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

 

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

 

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

 

1、首先真诚感谢如下文章做者的无私分享:web

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

http://www.javashuo.com/article/p-racdoggj-ga.html数据库

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

http://www.javashuo.com/article/p-zegqvqzz-dq.html浏览器

下面这篇博主总结得很是全面,很是感激:网络

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

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

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

 

2、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

 

3、让浏览器本身加载一个页面地址

通常状况下让浏览器对象执行

get(要打开的页面url)

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

 

4、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标签对象。

 

2、而后今天开始完成昨天接手的一个任务,也算是我学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有了更大的梦想。

 

3、拿到学Python后的第一笔收益后,我准备从明天起给本身放假

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

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

此后,我将继续学习并与你们一块儿分享第二阶段自学Python的的所有过程。

祝你们春节快乐!猪年大吉!

 

 

——————————

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

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

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

因而个人全部编程学习都改成了自学,继续本身的三步学习笔记法的学习之路。

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

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

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

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

很是乐意能与你们一块儿交流本身自学心得和发现,更但愿你们可以对我学习过程当中的错误给予指点——是的,这样我就能有许多免费的高师了——这也是分享时代,社区时代带来的好福利,我相信你们会的,是吧!

 

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

相关文章
相关标签/搜索