Python無頭爬蟲Selenium系列(01):像手工一樣操作瀏覽器

2020-12-22 Python數據世界

轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)

作為"數據玩家",如果手頭上沒有數據怎麼辦?當然是用代碼讓程序自動化採集數據,但是現在"爬蟲"不是那麼容易,其中最困難的即是突破網站各種反爬機制。本系列將全面講解 Python 中一個非常成熟的庫 —— selenium,並教會你如何使用它爬取網絡上所需的數據

自動化爬蟲雖然方便,但希望大家能顧及網站伺服器的承受能力,不要高頻率訪問網站。並且千萬不要採集敏感數據!!否則很容易"從入門到入獄"

本系列大部分案例同時採用 selenium 與 pyppeteer 庫講解,並且有 Python 和 C# 2門語言的實現文章,詳細請到公眾號目錄中找到。

前言

學習任何一個庫,必須先了解這個庫的機制與流程,今天先從一個小例子開始我們的學習之旅。

搜索並採集結果的標題

需求如下:

打開百度搜索主頁在輸入框輸入搜索內容(比如"爬蟲")點擊"百度一下"按鈕,進行搜索把結果頁面中的第一頁的各個結果的主標題抓取下來Selenium 的麻煩之處

本系列始終圍繞一點開展:"用代碼操作瀏覽器",下面看看整個流程:

Python 代碼通過 selenium 庫,控制"瀏覽器驅動"程序(一個 exe 文件)"瀏覽器驅動"程序則發送指令操控"瀏覽器"但是,市面上存在各種瀏覽器,而且就算只是一個廠商的瀏覽器也有不同的版本。怎麼能保證我們的代碼只需要寫一次,就能控制不同的瀏覽器?

深入一點的流程圖如下:

不同廠商不同版本的瀏覽器,都需要一個對應版本的"瀏覽器驅動""怎麼案例都沒開始,就在說 selenium 的不是呢?我到底還學不學?"

他有如下優點:

selenium 庫已經開發很久,相對來說比較穩定selenium 在各個語言的庫都是有 google 開發維護,因此不會出有些問題只在 Python 版本出現selenium 相比 pyppeteer 容易學一些有一個 selenium-ide 工具,能夠把手工操作過程直接轉換為 selenium 的代碼缺點:

不同版本不同廠商的瀏覽器需要不同的驅動程序無法精細控制請求過程的各種處理,如下無法在執行網站 js 代碼之前,執行自己的 js 代碼無法在登錄階段控制瀏覽器讓人工登錄獲得 cookies,後續直接請求獲得數據如果你認為無法接受 selenium 的缺點,可以查看 pyppeteer 的相關文章

獲得驅動

現在讓我們來開始使用 selenium 解決我們的需求。

首先,使用pip安裝selenium

你可以在 jupyter notebook 的 cell 中執行 "!pip install selenium"也可以在 cmd 中執行 "pip install selenium"由於我本機安裝了GoogleChrome瀏覽器,打開瀏覽器,看看瀏覽器的版本:

版本為 78.0.3904.70接著到相關網站(私信我"python")下載對應的驅動:

點擊進入瀏覽器版本號對應的目錄

下載 win32 版本壓縮包解壓後,裡面有一個 chromedriver.exe ,這個就是"瀏覽器驅動"萬事俱備

看過我的相關教學文章的小夥伴都知道,我很喜歡從語義角度去理解學習一個庫。

selenium 本質上是控制瀏覽器,因此當我們使用它的時候,代碼的語義應該與手工操作瀏覽器的過程大同小異才合理。

首先導入一些包:

下面來看看怎麼用代碼來描述我們的手工操作。

打開瀏覽器:

行1:webdriver.Chrome() ,實例化一個 Chrome 對象,如果你是其他瀏覽器,那麼就要實例化對應瀏覽器的對象這代碼相當於我們手工啟動瀏覽器一樣但是,代碼報錯了。他的意思是,他找不到"瀏覽器驅動"的確,剛剛我們把驅動下載下來,但是 Python 怎麼可能會知道去哪裡找到那個驅動程序呢。

我們可以在實例化瀏覽器對象時,傳入一個文件路徑,告訴他程序的具體位置:

注意,要傳入完整的文件路徑我們也可以直接把"驅動程序"放置在代碼所在目錄此時可以看到瀏覽器被啟動,默認開啟一個空白頁面,並且下方出現一行文字說,"此瀏覽器被控制"輸入百度搜索的網址

行2:wd.get() ,傳入網址即可注意,每次重複執行 webdriver.Chrome() 都會啟動一個新的瀏覽器滑鼠移到輸入框,點擊一下,然後輸入內容"爬蟲"

這裡的問題是,怎麼用代碼表達"滑鼠移到輸入框,點擊一下"?

事實上,selenium 真可以模擬滑鼠移動等操作(有些網站的登錄驗證碼需要用滑鼠拉動拼圖都可以模擬),但是現在的情況我們不應該模擬滑鼠,而是根據 html 標籤定位即可。

此時我們使用瀏覽器的"開發者功能",進行定位即可。

由於篇幅關係,本文不詳細講解"開發者功能"的所有操作,詳細講解將放在:數據大宇宙 > 爬蟲工具 > 系列文章

也可以按快捷鍵 F12 啟動此功能(大部分瀏覽器都可以)下面用一個動態圖展示操作過程:

點擊功能區(右區)的左上角的小標籤,開啟定位模式此時滑鼠移到頁面區(左區),滑鼠移到的地方,右區會顯示此元素在 html 的位置我們看到,輸入框是一個 input 標籤,我們要在代碼中告訴 selenium 找到這個 input 標籤即可那麼用啥"暗號"表示這個 input 標籤呢?有2種常見的方式,css 選擇器 或者 xpathselenium 文檔中強烈推薦你使用 css 選擇器我們選用 css 選擇器,因此,在右區的 input 標籤上,按滑鼠右鍵,選 "copy" ,然後選擇"copy selector" ,此時已經把"暗號"複製到剪切板上看看代碼:

行3:wd.find_element_by_css_selector ,使用 css 選擇器找到元素,方法中傳入剛剛複製的"暗號"(按 ctor + v ,粘貼即可)。注意是字符串,因此要用單引號包圍此時,變量 input_box 則表示輸入框接著,

輸入內容"爬蟲"

行4:input_box.send_keys ,往該元素髮送按鍵,這個方法不僅僅能發送鍵盤的按鍵,還能往可輸入的元素髮送文本此時可以看到,瀏覽器已經輸入了內容"爬蟲",並且還可以看到下方已經出現搜索結果(這是因為現在的搜尋引擎都提供這種邊輸入邊查詢的功能)我們繼續模擬點擊輸入框右邊的"百度一下"這個按鈕。

同樣用"開發者功能",定位該元素,並複製css選擇器表達字符串:

行7:用 css 選擇器找到按鈕行8:act_btn.click() 方法,對元素模擬點擊現在瀏覽器顯示的頁面,就有我們需要的所有的內容所有結果的主標題:

這個可能對初學者有點難度,因為我們這次需要一次選擇多個元素(多個搜索結果的主標題),看看定位到的標籤:

每個搜索結果,都是一個 div標籤(上圖右區下方紅框)而所有的搜索結果的 div,都被包在一個 id='content_left' 的 div 標籤裡面(上圖右區上方紅框)進一步看看我們需要的主標題在哪裡:

我們要的數據都在一個 a 標籤下並且這個 a 標籤被放在一個 h3 標籤裡面那麼,現在我們要用 css 選擇器表達以下語義:在一個div(id=content_left)裡面,h3 標籤裡面的 a 標籤的文本。div 與 h3 之間可能嵌套了多層

得到的選擇器表達式如下:

div[id=content_left] 表示 div 標籤,他的 id 屬性為 content_leftdiv 與 h3 之間用空格分開,表示他們是祖孫關係,就是 div 與 h3 之間有其他任意多的其他標籤嵌套h3 與 a 之間,用">" 分開,表示父子關係,就是 a 標籤就是在 h3 標籤包圍調用代碼如下:

行10:wd.find_elements_by_css_selector ,查找符合選擇器的多個元素,注意方法名字的單詞 elements 是複數的,與 行4 和 行7 的方法是不一樣此時,titles 其實是一個列表,裡面全是符合條件的 a 標籤,但是我們的目標是 a 標籤裡面的文本行11:調用 a 標籤的文本屬性,獲得其文本但是,你會發現結果啥也沒有!!!代碼執行太快了

上面的代碼之所以拿不到任何結果,是因為當執行到第10行的代碼時,頁面上還沒有加載任何的結果。

如果是一個人在操作瀏覽器,那麼你應該跟他說:嘿,一直到你看到那些結果,你再去提取主標題啊。

怎麼表達"一直到你看到那些結果"?,selenium有專門用於等待元素出現的機制,代碼如下:

行10:實例化一個 WebDriverWait 對象,注意在一開始導入包的時候,我們導入了 import selenium.webdriver.support.wait as WA行11:調用 wait.until 方法,傳入 lambda ,selenium 會定時執行裡面的方法,直到裡面的方法有返回對象此時可以見到,我們得到了結果關於更多等待機制的知識點,請關注本系列後續的文章加上關閉瀏覽器的控制,完整代碼如下:

總結

用代碼控制 selenium 基本與人工操作一致,一般的流程:

啟動瀏覽器定位元素(必要時要等元素出現)操作元素(點擊或其他)不斷進行定位與操作過程,直到出現目標頁面,爬取數據即可下一節,將介紹更多 selenium 的技巧,敬請關注!!

私信我"python",獲取本系列文章所有相關資料和源碼

相關焦點

  • 10分鐘玩轉Python+Selenium自動化測試,快速入門通道!
    不要一提代碼就恐怖哦(很多測試工程師的通病),其實python與selenium就是一個【紙老虎】,要勇於面對,勇於挑戰哦,要不自己沒有技術上的競爭力,誰來給你漲薪呢?!、python上手容易,語法簡單、大量第三方模塊的支持- selenium針對b/s支持非常好,目前各大主流瀏覽器均支持。
  • python+selenium+pyquery實現數據爬蟲
    目標: 首先我們本次爬蟲的任務是完成某採購網站的信息爬取,省去人工耗費的時間。快速篩選出我們的需要的指定信息。然後將招標信息的標題、連結、和時間找出來,並保存到Excel。
  • Python安裝Selenium庫的方法
    Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
  • python爬蟲很強大,在爬蟲裡如何自動操控瀏覽器呢?
    概述:python通過selenium爬取數據是很多突破封鎖的有效途徑。但在使用selenium中會遇到很多問題,本文就通過一問一答的形式來通熟易懂的普及如何通過selenium執行javascript程序,進而獲取動態執行後的網頁。如果你喜歡,歡迎轉發本文。
  • Python爬蟲入門之請求庫的安裝
    在抓取頁面的過程中,我們需要模擬瀏覽器向伺服器發出請求,所以需要用到一些python庫來實現HTTP請求操作。在爬蟲的講解過程中,我們將用到的第三方庫有requests、Selenium和aiohttp等。我們將先介紹這些請求庫的方法。
  • Selenium 做超級爬蟲,自動機器人,自動打卡,藐視一切反爬
    這幾個步驟操作能採集到數據,但是速度效率太慢!所以以上步驟做成機器自動操作效率將能大大提升,而且能24小時工作。推而廣之就能做自動操作機器人。簡而概之,就是將人操作瀏覽器網站的工作用機器人代替。Selenium就是這個框架,支持Java,python語言編寫。
  • 最全的 Python 反爬蟲及應對方案!
    通過User-Agent來控制訪問無論是瀏覽器還是爬蟲程序,在向伺服器發起網絡請求的時候,都會發過去一個頭文件:headers,比如知乎的requests headers。這裡面的大多數的欄位都是瀏覽器向服務表明身份用的對於爬蟲程序來說,最需要注意的欄位就是:User-Agent很多網站都會建立user-agent白名單,只有屬於正常範圍的user-agent才能夠正常訪問。
  • 自動化測試工具Selenium+Python的簡單介紹
    Selenium是一個用於Web應用程式測試的工具,Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。Python則是強大的腳本語言,已廣泛地應用於自動化測試中。本文簡單介紹一下Selenium和Python的使用。
  • Python Selenium設計模式-POM
    前言本文就python selenium自動化測試實踐中所需要的POM設計模式進行分享,以便大家在實踐中對POM的特點、應用場景和核心思想有一定的理解和掌握。為什麼要用POM基於python selenium2開始UI級自動化測試並不是多麼艱巨的任務。
  • Python之selenium自動化測試
    今天我們就來說下使用selenium包下的webdriver自動打開瀏覽器的場景下,如何操作。一、環境準備我們直接先說下mac下chrome的自啟動,預裝環境如下,1、Python3.62、chrome瀏覽器3、pip3裝好selenium命令:sudo
  • Python+Selenium詳解(超全)
    這也是最重要的一點,不管你以前更熟悉 C、 java、ruby、python、或都是 C# ,你都可以通過 selenium 完成自動化測試,而 QTP 只支持 VBS支持多平臺:windows、linux、MAC ,支持多瀏覽器:ie、ff、safari、opera、chrome
  • 用python爬蟲框架scrapy抓取王者榮耀官網所有英雄信息
    工具:pycharm、python3.6、requests庫、scrapy庫和selenium、 PhantomJS庫目標url獲取:http://pvp.Pipelines.py內容(最終文件為json格式):記得在settings.py裡面將ITEM_PIPELINES打開,並設置ROBOTSTXT_OBEY False(不打開不能保存文件,設置robotstxt是跳過網站ROBOT協議)然後就是spiders文件下新建一個hero.py,用來寫我們的爬蟲
  • Python網絡爬蟲
    Python網絡爬蟲第一篇(一):為什麼要學習網絡爬蟲?大數據成為當今時代的熱門話題之一,在數據量爆發增長的網際網路時代,網站與用戶溝通實質為數據的交換。如果大量的數據得以分析,我們能夠對事件的看法,解決方案做出更好的決策。
  • 零基礎的你如何用python+selenium開始自動化測試?
    需求:用python+selenium進行自動化測試所需工具:python、selenium(框架)、Chrome瀏覽器、chromedriver(瀏覽器驅動)步驟一:安裝python3.7.2(我用的是最新版本)進入官方網站:https://www.python.org/
  • Python Selenium - SSL站點處理
    前言隨著現在站點對安全的要求越來越高,越來越多的企業網站接入了https,隨著https的大規模應用,我們在使用python selenium2進行自動化測試時,也要面臨的挑戰面臨的問題在實際的自動化測試實踐中,因為越來越多的站點接入https,使得我們原有的python selenium2自動化測試代碼進行測試時,瀏覽器總是報安全問題,即便在瀏覽器選項中將被測網址加入信任網址也沒用。
  • 又到雙11,教你用selenium自動秒搶淘寶商品(附詳細入門指南)
    selenium是一款web自動化測試工具,可以很方便地模擬真實用戶對瀏覽器進行操作,它支持各種主流瀏覽器:IE、Chrome、Firefox、Safari、Opera等。selenium有多種程式語言的客戶端驅動,編寫自動化腳本語法簡潔,其中python的selenium庫便非常的受歡迎。
  • 156個Python網絡爬蟲資源,媽媽再也不用擔心你找不到資源
    全能型爬蟲grab – 網絡爬蟲框架(基於pycurl/multicurl)scrapy – 網絡爬蟲框架(基於twisted)pyspider – 一個強力的爬蟲系統cola – 一個分布式爬蟲框架其他portia – 基於Scrapy的可視化爬蟲restkit – Python
  • Python網絡爬蟲-第一行代碼-windows環境
    最簡單的爬蟲就這麼幾行!!!引入requests庫,用get函數訪問對應地址,我們訪問的是騰訊發布新冠肺炎疫情的地址。判定是否抓取成功的狀態,r.text列印出抓取的數據。然後菜單欄點擊Run->Run Module 會彈出Python的命令行窗口,並且返回結果。
  • Python爬蟲小白入門—PhatomJS+Selenium第一篇
    那麼就只有模擬下拉操作了。  想要模擬下拉操作,我們需要用到兩個工具,一個是PhatomJs,一個是Selenium。  PhatomJS其實就是一個沒有界面的瀏覽器,最主要的功能是能夠讀取js加載的頁面。  Selenium實質上是一個自動化測試工具,能夠模擬用戶的一些行為操作,比如下拉網頁。
  • 「Python爬蟲實戰系列(3)」——爬取淘寶商品信息
    歡迎大家關注公眾號【哈希大數據】小白學爬蟲第六篇我們介紹了selenium庫的用法,這個庫可以說是Python爬蟲的一大利器,掌握了它的用法我們就可以爬取很多利用Ajax加載的網站啦例如淘寶網,廢話不多說下面介紹如何利用Selenium+Beautiful Soup爬取淘寶商品信息。