1. 程式人生 > >孤荷淩寒自學python第八十六天對selenium模塊進行較詳細的了解

孤荷淩寒自學python第八十六天對selenium模塊進行較詳細的了解

滾動 8.4 logs 任務 準備 幫助 我不 a標簽 教學

孤荷淩寒自學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模塊進行較詳細的了解