孤荷凌寒自学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

原文地址:https://www.cnblogs.com/lhghroom/p/10347321.html

时间: 2024-10-08 13:52:28

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

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

孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongoDB的简单操作,并继续对一些可能反复经常使用的操作进行简单的封装.同时通过搜索了解了如何对本地Mongo数据库进行权限设置(没有实践本地数据库的用户权限设置.) 按个人规划,今天是初步了解学习MongoDb数据库的最后一个学习日,后续将在真正使用此数据库时,再对其进行深入研究. 一.今天完成了两个可

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

(完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进一步优化了自定义函数的写法. 一.优化并新增了几个操作word文档的函数 ``` #!/usr/bin/env python3 # -*- coding: utf-8 -*- import string import time import random from docx.enum.style import WD_STYLE_TYPE #所有样式 (包括段落.文字

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

(完整学习过程屏幕记录视频地址在文末) 由于本身tesseract模块针对普通的验证码图片的识别率并不高,据说需要进行专门针对具体某一型号的验证码图片的训练才可以,因此今天的学习重点是搭建jTessBoxEditor环境来进行tesseract训练数据的训练和生成. 是完全参照以下博客内容来进行的: https://www.cnblogs.com/zhongtang/p/5555950.html 具体操作过程见文末的操作过程屏幕录像. 在整个训练过程中我的主要感受是: 都说tesseract是基

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

(完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第二天.仍然感觉付出的时间与收获完全不成正比,万事开头的时候,总是那么困难,不过今天历尽困难总算还是成功在本地连接上了远端的mongoDB数据库(就是我注册的官方的试用版本的数据库,就在官方网站服务器上.) 一.首先在官方网站为我注册的账号新建的项目[Clusters0]中添加了一个测试数据库(database),命名空间为:ghlhfirst(具体添加过程不是很复杂,但要通过文字描述又比较有难度,而且最开始要找到这个添加过

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

(完整学习过程屏幕记录视频地址在文末) 今天在昨天基本尝试成功的基础上,继续完善了文字和图片的同时爬取并存放在word文档中. 一.我准备爬取一个有文字也有图片的博客页面 https://www.cnblogs.com/forever-snow/p/8506746.html 二.具体代码 ``` import requests from bs4 import BeautifulSoup import re import datetime import pymongo import os from

孤荷凌寒自学python第八十一天学习爬取图片1

(完整学习过程屏幕记录视频地址在文末) 通过前面十天的学习,我已经基本了解了通过requests模块来与网站服务器进行交互的方法,也知道了BeautifulSoup模块的基本用法. 但之前的学习主要还是获取网页上的文字内容为主,从今天起我开始尝试学习从网页上获取其中的图片并下载到本地. 一.首先加深了对requests模块的认识 找到了requests模块的官方文档: http://docs.python-requests.org/en/latest/user/quickstart/ 是全英文的

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

(完整学习过程屏幕记录视频地址在文末) 学习Python我肯定不会错过图片文字的识别,当然更重要的是简单的验证码识别了,今天花的所有时间都用于寻找最偷懒的方式来解决这一经典问题. 结果发现,还是大名鼎鼎的[tesseract]是最受欢迎的,于是就着手配置tesseract的相关环境. 今天的主要操作都是在windows10的64位系统下进行的. 一.第一步,安装tesseract-ocr在windows64位下的版本 我把这理解为环境配置. 首先在github的tesseract的安装指引页面去

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

(完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作,并继续对一些可能反复经常使用的操作进行简单的封装. 今天成功了解并实测完成了向mongoDB数据库中删除记录的操作,详细学习过程见屏幕录屏学习过程. 一.首先解决了昨天没有解决的修改记录的问题 今天花了一定的时间认真看相关资料,发现在修改记录时: [方法一]: 集合对象.update({查询记录的筛选条件字典},{要修改的字段的信息},True) 这种方法与下面的方法结果 是

孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2

(完整学习过程屏幕记录视频地址在文末) 今天继续学习beautifulsoup对象的属性与方法等内容. 一.今天进一步了解到的BeautifulSoup模块中的一些用法小结: 1. Html标签对象.parent #返回直接上一级父级对象整体 2. Html标签对象.parents #parents返回从a对象的直接父级对象开始的各个逐个上升的父级直到<html></html>级为止的宗谱链,是一个生成器 3. Html标签对象.next_sibling #获取当前Html标签对象