Selenium元素定位初探(以今日頭條首頁為例)

2021-01-13 百家號

隨著網頁技術的發展,動態網頁的比例越來越高,原來抓取靜態網頁的許多方法變得不再適用;再加上越來越多的網站添加了各種複雜的反爬蟲策略,導致直接通過網絡請求的方式去抓取頁面的方式已經有些落伍了。

而Selenium可以通過模擬瀏覽器的真實行為來訪問網頁並將頁面源碼緩存下來,從而實現所見即所得的效果。Selenium本身廣泛應用於測試領域,但是它所見即所得的特性基本上滿足了我們抓取絕大多數頁面的需求,因此今天我們就看一下如何通過Selenium訪問頁面並通過不同的方式定位到我們需要的元素,從而完成頁面抓取。

我們以今日頭條的官網首頁(https://www.toutiao.com)來進行演示。

歡迎大家關注我的個人博客【數洞】(www.data-insights.cn)

一、通過ID定位

首先我們看下如何通過元素id來定位。在頭條首頁,有一個右邊欄,通過檢查頁面元素我們發現,這是一個id="rightModule"的<div>標籤,那麼我們就通過這個ID來定位到這個元素,並且列印出該元素的class屬性。

# -*- coding:utf-8 -*-from selenium import webdriverif __name__ == '__main__': driver = webdriver.Chrome() driver.get('https://www.toutiao.com') element_class = driver.find_element_by_id('rightModule').get_attribute('class') print(element_class)輸出為:

bui-right index-right-bar在這裡,我們先通過driver = webdriver.Chrome()啟動一個Chrome Driver,這裡需要保證我們的環境變量目錄中已經包含了與我們的Chrome瀏覽器版本對應的chromedriver,大家可以自行搜索下載並安裝。

然後我們通過driver.get('https://www.toutiao.com'來控制瀏覽器打開頭條的首頁;接下來,find_element_by_id('rightModule')的作用就是在頁面源碼中定位到包含了id="rightModule"屬性的元素,也就是上邊提到的右邊欄對應的元素;最後我們使用get_attribute('class')方法,取出該元素class屬性的值。

很簡單,不是嗎?

另外提一句,所有的find_element_by_XXX方法都會返回定位到的第一個元素,加個s後,即所有的find_elements_by_XXX方法則會以列表形式返回符合條件的所有元素。比如上邊這個例子,如果我們改成driver.find_elements_by_id('rightModule')則會以列表形式返回所有符合條件的元素(當然,在這個例子中,事實上列表的長度也只有1)。

二、通過name定位

跟ID類似,selenium提供了find_element_by_name和find_elements_by_name方法來通過name屬性定位元素。

頭條首頁右側,有一個淘寶廣告的模塊,裡邊有一些輪播圖,接下來我們就通過name屬性定位到它,並列印出它的ad_name屬性的值。

element_ad_name = driver.find_element_by_name('home_right*top_1')\ .get_attribute('ad_name')print(element_ad_name)輸出為:

h_300*250_TB_314使用方法和find_element_by_id如出一轍。

三、通過class定位

聰明如你可能會猜測,通過class定位元素的方法應該是find_element_by_class和find_elements_by_class,那麼,「恭喜你,答錯了!」(這一句是我上學的時候最痛恨的被老師嘲諷的話,今天說出來給別人,感覺很爽!)

事實上,這兩個方法應該是find_element_by_class_name和find_elements_by_class_name,比我們猜測的多了個後綴(是的,最開始我也猜錯了),他們會定位到class取值包含某個字符串的所有元素。

我們注意到頭條首頁左側有一個邊欄,列出了一些頻道,那麼我們如何定位並列印出這些頻道名稱呢?

觀察頁面源碼,我們發現頻道名稱隱藏在一個<span>標籤中,而這個<span>標籤,有一個class="channel-item"的<a>父標籤。同時我們也注意到,第一個頻道——「推薦」的標籤屬性與其他的頻道標籤屬性不同,它的class取值為channel-item active。

channel_element_list = driver.find_elements_by_class_name('channel-item')channel_list = [x.text for x in channel_element_list]print(channel_list)輸出為:

['推薦', '陽光寬頻', '熱點', '圖片', '科技', '娛樂', '遊戲', '體育', '汽車', '財經', '搞笑', '更多', '', '', '', '', '', '', '', '', '', '', '']我們看到除了頁面上看到的頻道以外,還有一些空的字符串。這是因為「更多」這裡在懸浮的時候會產生更多的可選頻道,我們在沒有進行懸浮操作的時候,暫時看不到這些頻道。這個問題以後我們可以通過一系列的動作等方式來解決。

四、通過tag名稱定位

通過標籤名稱定位的方法為find_element_by_tag_name和find_elements_by_tag_name,這個方法可以直接選擇標籤。

仍以上例來說明,我們看到,上邊的例子中,我們直接對選擇到的<a>標籤選擇了它的text屬性,並獲取了文本,但事實上文本存在於<a>的子標籤<span>中。那麼我們為什麼能成功呢?這是因為.text屬性查詢的是所有子孫節點中的文本。

考慮另一種情況,假如上述的<a>標籤有多個子孫標籤,且都有不同的文本,而我們只要想<span>標籤中的文本時,應該如何操作?

text = driver.find_elements_by_class_name('channel-item')[5].find_element_by_tag_name('span').textprint(text)輸出為:

'娛樂'可以看到,我們在定位到<a>標籤後,選擇了它的子標籤<span>並成功列印出對應的文本。

五、通過XPath定位

這是一大利器,XPath在定位頁面元素上的強大不容置疑,不了解XPath的同學可以閱讀我的另一篇文章:《Python3使用Xpath解析網易雲音樂歌手頁面》。這篇文章通過實戰演練,講解了如何快速上手XPath並解析網易雲音樂的歌手頁面。

selenium中提供了對XPath的支持,我們可以通過find_element_by_xpath和find_elements_by_xpath來靈活地運用XPath進行元素定位。

頭條首頁中間,有一些內容列表,那我們就看看如何獲取這些內容的標題。

觀察頁面源碼,可以看到這些內容都藏在一個class="title-box"的<div>標籤的子標籤<a>中。

title_elements = driver.find_elements_by_xpath('//div[@class="title-box"]/a')titles = [x.text for x in title_elements]print(titles)輸出為(輸出較長,故隱藏部分內容):

['中共中央政治局召開會議 習近平主持', '五次出席G20峰會,習近平提出哪些「中國主張」?', ...]事實上,XPath是支持直接獲取文本列表的,但是目前selenium對XPath的支持還不夠豐富。想要體驗更強大的XPath的朋友可以讀一下上邊提到的那篇文章,十分鐘即可入門。

其他定位方式

目前selenium支持的元素定位方式還有三種:

CSS選擇器:find_element_by_css_selector和find_elements_by_css_selector,支持以層疊樣式表(CSS)的方式定位元素;Link:find_element_by_link_text和find_elements_by_link_text,支持通過連結文本來定位元素;Partial Link:find_element_by_partial_link_text和find_elements_by_partial_link_text,支持通過連結文本的一部分來定位元素。不過這三種我自己用的比較少,它們的使用也非常簡單,有CSS基礎或者對這三種方法感興趣的朋友可以自行檢索資料學習。事實上,上述的五種方法已經足夠我們選取任何頁面元素了。

相關焦點

  • 今日頭條被政府約談,應用首頁清空一天
    現在打開今日頭條,首先出現的 「推薦」 欄目已經沒有內容,只有一條 「本頻道將於 12 月 29 日 18 點至 12 月 30 日 10 點間進行升級維護,請瀏覽其他頻道」 的公告。說是維護,但北京網信在 29 日下午公布的消息是今天約談了今日頭條,理由是傳播色情低俗信息,存在嚴重導向問題,並且 「在尚未獲得網際網路新聞信息服務資質的情況下,今日頭條手機客戶端違規轉載新聞信息」,因此「責令即停止違法違規行為。」一同被約談的還有鳳凰新聞客戶端。
  • 今日頭條收購錘子科技,意欲何為?-虎嗅網
    1月2日下午,有消息傳出稱,今日頭條或將收購羅永浩的錘子科技。消息一出,頓時引起業內人士關注。對於此前四處尋求賣身的羅永浩而言,今日頭條創始人張一鳴真的是尋找中的那個「真命天子」嗎?而今日頭條收購錘子科技,又到底意欲何為?
  • 在Python Selenium WebDriver中使用JavaScript執行操作
    例:javaScript = "document.getElementsByName('username')[0].click();"driver.execute_script(javaScript)我們在這裡做什麼?第1步:我們正在使用JavaScript檢查並通過屬性「名稱」獲取元素。(另外,可以使用'id'和'class'屬性。)
  • 今日頭條有意收購錘子科技部分專利
    oZtEETC-電子工程專輯據了解,意向收購錘子科技共三家公司,其一為今日頭條;其二為360;還有便是羅永浩舊友劉江峰。劉江峰本人是手機行業資深老兵,此後創立優點科技,發力智能硬體行業。oZtEETC-電子工程專輯有媒體就此事向劉江峰諮詢,劉稱之前洽談過,不過沒搞定。
  • 今日頭條競品分析報告
    項目描述1.1 競品分析描述通過分析目前市場上的新聞資訊類的APP,分析其直接競品,對今日頭條進行全面的分析。同時與其他軟體相對比,進一步優化產品的結構和布局,確立產品的核心功能。通過市場分析,了解用戶的核心需求,為以後的今日頭條優化做準備。1.2 測試環境
  • 「今日頭條」變成了「今日油條」涉及了哪些商標法
    「今日頭條」變成了「今日油條」涉及了哪些商標法由北京事業單位考試網提供:更多關於事業單位備考,北京事業單位備考的內容請關注北京事業單位考試網!或關注北京華圖微信公眾號(bjhuatu),如有問題也可點擊聯繫各校區。
  • 新聞聚合app那麼多 今日頭條之後我們還該看好誰
    在綜合門戶移動客戶端林立的情況下,今日頭條依然斬獲了屬於它的一方天地,CEO張一鳴曾表示:「我當然想做龍頭,規模越大就有越多的資源來提高技術。」由此可見今日頭條的野心,爾後,國內不少新聞閱讀產品都把今日頭條的「個性化閱讀」學了去,可惜始終不得其精髓。
  • 今日頭條副總編輯徐一龍:除了推薦和搜索,頭條還有熱點分發
    11月25日,2020今日頭條生機大會在北京舉行。今日頭條副總編輯徐一龍介紹了頭條的熱點分發模式。在他看來,重大熱點新聞就像「熱刀插黃油」,可以輕易穿透不同用戶群體之間的興趣壁壘,能夠有效補充推薦分發、社交分發和搜索分發之外的內容形態。
  • 即刻VS今日頭條:深度分析個性化推薦機制與內容差異化突破
    選擇了今日頭條(版本5.8.0)和即刻(版本2.7.0)這兩個應用作為分析對象,對比他們目前各自的個性化推薦機制和提供的資訊內容,並給出我的結論:即刻運用「主題」的新模式能夠更精確匹配用戶的新聞閱讀需求,並實現信息的集成,加上精選的內容,在信息爆炸的時代更能實現產品定位的突破。
  • 今日頭條的 2018:整改、抗爭,與那些瘋狂擴張
    如今在App Store,皮皮蝦的介紹也為:今日頭條官方爆笑社區,代言人為娛樂明星沈騰。但值得注意的是,騰訊有微信這一龐大的社交場景,將是頭條系短視頻在發展路上一大難以逾越的阻礙。品牌名稱從今日頭條變為字節跳動在內部優化調整上,今日頭條對外較為低調和神秘。根據公開消息,2018年今日頭條主要發生兩大變動:一是字節跳動取代今日頭條成為整體品牌的名稱;二是今日頭條CEO由張一鳴變更為陳林。
  • 今日頭條上線「頭條百科」 能改變搜索領域現有格局嗎?
    圖片來源:視覺中國字節跳動再度加碼搜索從產品形態上看,頭條百科是今日頭條和互動百科融合的產品。公開信息顯示,頭條百科沿用了baike.com為域名,目前只能在移動端瀏覽頭條百科,PC端仍然是互動百科的頁面。每經記者在今日頭條APP裡搜索頭條百科,相關信息顯示,頭條百科是今日頭條旗下的中文網絡百科全書。此前字節跳動進軍搜索,後來推出了獨立的頭條搜索APP,對於頭條百科的戰略規劃,每經記者採訪字節跳動,截止發稿,未有官方回應。推出頭條百科,字節跳動早就埋下了伏筆。
  • 央視曝光今日頭條無視監管做「黑勾當」 卻害苦了北京這家百年老店
    3月10日,記者首先來到了廣西南寧,剛剛到達機場,記者就打開了手機上的「今日頭條」客戶端,隨著記者所處城市的變化,今日頭條上的廣告果然也在精準變化,在南寧地區的今日頭條首頁推薦欄內,「補氣血」三個字赫然出現在手機屏幕上。
  • 今日頭條極速版邀請碼大全?填寫今日頭條極速版邀請碼技巧
    今日頭條極速版推出也有幾年時間了,關於邀請碼怎麼填?網上這方面的搜索任然有不少,今日頭條極速版邀請碼是【1169567478】和【C8JLL4H8】和【DDLLPV5R】。 或許看到這裡的朋友 比較好奇我再今日頭條極速版上賺了多少錢? 明人不說暗話,這麼跟你們說吧,這三年來每天早餐 沒有自掏腰包過,今日頭條極速版賺的錢即可實現 早餐自由的目標。
  • 今日頭條內容營銷大全:選人、投放、數據效果全揭秘
    在為客戶進行營銷策劃時,我始終提醒客戶:內容即增長,渠道即效果。粗放式的投放時代過去,更精準、更真實,且更能帶來實際轉化的流量是我們所關注的。當我們更關注人群匹配度、低CPM、內容效果、數據效果的時候,今日頭條作為一個長期被低估的內容營銷陣地,值得被大家關注。最近為客戶做策劃,在今日頭條上規劃了一定的比例,效果非常不錯,更多的客戶也因此想嘗試。
  • 今日頭條2021版下載
    今日頭條是一款用戶量超過60,000,000的新聞閱讀客戶端,可以自定義訂閱自己想看的一些新聞種類,今日頭條手機版的自定義比較強,可以篩選一些不感興趣類的新聞資訊,整體還是不錯,適合愛.看新聞的朋友。
  • 今日頭條喜歡怎樣的照片?
    以昨天下午發布的一組社會紀實照片為例,目前閱讀量已經超過34萬這組訪問量超過30萬的照片,沒啥構圖,沒啥光影……這組訪問量超過30萬的照片,引發了「如何把大學更好開放」「大學如何更加安全」等討論一、今日頭條已經成長為國內最大的社會紀實攝影分享平臺有點資歷的攝影愛好者,一定會記得2003年的太平洋電腦網推出了攝影博客吧
  • 今日頭條CEO朱文佳:在頭條,看見更大的世界
    11月25日,2020今日頭條生機大會在北京舉行。今日頭條CEO朱文佳發表致辭並宣布啟用產品新Slogan「看見更大的世界」。他表示,不僅是用戶因為看到頭條上的內容,接觸到了更大的世界,頭條創作者們同樣因為創作內容,成就了自己,走進了一個更大的世界。  以下為朱文佳致辭全文。  大家好,我是朱文佳。
  • 拿到今日頭條的投資,「石墨文檔」現在怎樣?
    「石墨文檔」成立於2014年5月,產品於2015年6月正式上線,定位中國版的Google Docs,可以實現多人同時在同一文檔及表格上進行編輯和實時討論。此前公司於2016年8月獲得過數千萬元 Pre-A 輪融資,領投方為山行資本,心元資本、初心資本、九合創投創始人王嘯跟投,同期發布企業版產品。
  • 今日頭條的增量在哪裡?_詳細解讀_最新資訊_熱點事件_36氪
    今年頭條生機大會,沒有發布希麼大的戰略和產品,朱文佳只是說要練好基本功:「無非是內容做得更好一點,推薦做得更準一點,創作者服務做得更到位一點。」 大會的主題是「致敬真知灼見」,代表著頭條內容生態進入了專業、聚焦的階段。內容層面,新聞資訊和泛知識是基本盤,頭條發現新的增量是專業作者,為此成立了今日頭條奇點工作室幫助1000位作者更好創作視頻內容。
  • 狹義相對論誕生114周年,今日頭條上線愛因斯坦開屏
    當天,今日頭條客戶端上線愛因斯坦定製開屏。海報以愛因斯坦為主體,繪製了時間膨脹鍾、光錐、數學公式等元素,以紀念愛因斯坦在經典力學領域作出的傑出貢獻。  此前,6月29日,今日頭條官方頭條號曾發布一則懸念海報,海報上繪製有螺旋狀時鐘和一個特定日期:「1905.6.30」,引發了網友的跟帖猜想。