1. 程式人生 > >【騰訊TMQ】如何輕鬆爬取網頁資料

【騰訊TMQ】如何輕鬆爬取網頁資料

一、引言

在實際工作中,難免會遇到從網頁爬取資料資訊的需求,如:從微軟官網上爬取最新發布的系統版本。很明顯這是個網頁爬蟲的工作,所謂網頁爬蟲,就是需要模擬瀏覽器,向網路伺服器傳送請求以便將網路資源從網路流中讀取出來,儲存到本地,並對這些資訊做些簡單提取,將我們要的資訊分離提取出來。

在做網頁爬蟲工作時會發現並不是所有網站都是一樣,比如有些網址就是一個靜態頁面、有些需要登入後才能獲取到關鍵資訊等等。此外,python簡單而又強大,又有不少第三方庫可以讓我們輕鬆拿到瀏覽器中所看到的內容。因而,本文將根據網站特性進行分類介紹幾種使用python完成網頁爬蟲的方法。

二、靜態頁面

在做爬蟲工作時,什麼型別的網站最容易爬取資料資訊呢?不需要登入等處理,直接用Get方法請求URL即可從伺服器獲取到返回資料,如我們訪問一些部落格文章,一個Get請求就可以拿到部落格文章裡的內容。下面將舉例介紹如何爬蟲這種型別頁面內容該如何爬取。

示例

1、需求說明:假設我們需要及時感知到電腦管家官網上相關產品下載連結的變更,這就要求我們寫個自動化程式從官網上爬取到電腦管家的下載連結。

2、分析過程:在瀏覽器中開啟https://guanjia.qq.com,按下F12, 檢視網路請求,內容如下圖。這裡只有一個Get請求,沒有登入,也不涉及加密過程。此外,點選Elements,可以很容易的從原始碼中找到下載連結。

圖1

3、解決方案: requests是python的第三方庫,可以傳送網路請求資料並獲取伺服器返回的原始碼。使用requests庫獲取到html檔案,然後利用正則等字串解析手段或者BeautifulSoup庫(第三方庫)完成資訊提取。下面程式碼展示的是利用requests庫和BeautifulSoup庫完成資訊提取。


圖2 原始碼截圖

知識點

1、有些網路伺服器反感爬蟲,會對請求頭做個簡單判別,直接拒絕那些明顯是由自動化程式發起的請求。就例如圖2中的程式碼,python使用的預設請求頭User-Agent值為Python-urllib/3.4,而瀏覽器訪問時User-Agent值為:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.3。為了避免自動化程式被拒絕,在請求時可以修改請求頭,讓自動化程式更像一個瀏覽器。

2、在網頁爬取時,可能會遇到公司網路不允許訪問外網的情況,這時就需要設定代理IP: requests.get(“

https://guanjia.qq.com“, proxies={“http”:“127.0.0.1:8087”})

3、BeautifulSoup庫是HTML/XML解析器,它可以很好的處理不規範標記並生成剖析樹,通常用來分析爬蟲抓取的web文件,可以大大節省程式設計時間。

三、POST表單

前面介紹的是通過HTTP協議的Get方法去請求資訊,對應網站不涉及post表單。表單是含有標籤,是要互動的資料區域,你可能需要輸入文字、做下拉選擇等,完成與伺服器的互動。下面將給個簡單的示例讓大家理解post表單情況。

示例

1、需求說明:訪問網址,並輸出伺服器返回內容。

3、解決方案:仍然使用強大的requests庫完成post表單操作,下面將僅展示post登入那裡,登入過後的頁面內容解析和第二部分一致,這裡不再詳細贅述。

知識點

1、需要注意cookie的追蹤。一旦網站驗證了你的登入權證,它將會將登陸權證儲存在瀏覽器的cookie中,若是我們一直自己處理cookie的追蹤,在面對複雜網址時將會比較麻煩,降低開發效率。我們可以使用Session物件解決這個問題,就如上述截圖程式碼中。Session會持續跟蹤會話資訊,包括cookie,header。可以呼叫session.cookie.get_dict()檢視當前session cookie值。

2、在表單中存在“隱含”欄位,該欄位是對瀏覽器可見,但是對使用者不可見。一般而言,“隱含”欄位是在每次Get請求時生成,每次開啟同個網址,同個“隱含”值不一樣。這個處理有一定的反爬蟲效果。至於“隱含”欄位是否作為post引數,可以手動在瀏覽器下完成表單請求,觀察請求引數是否包含某個“隱含”引數。如下圖:網址包含“隱含”欄位,並在post時帶上。


第二部分介紹的header、代理IP同樣適用於這裡。

四、HTTP基本接入認證

基本認證是一種用來允許Web瀏覽器後者其他客戶端程式在請求時,提供使用者名稱和口令形式的身份憑證的一種登入驗證方式。把“使用者名稱+冒號+密碼”用BASE64演算法加密後的字串放到httprequest中的headerAuthorization中傳送給服務端。在發明cookie之前,HTTP基本認證是處理網站登入最常用的方法,目前一些安全性比較高網址還在使用這種方式。

示例

1、需求說明:訪問某網站(涉及內部,不對外公佈)。

2、分析過程:在瀏覽器中輸入該網址,看到如下頁面。這時候需要輸入使用者名稱和密碼才能得到所需要的資料。否則會返回錯誤程式碼401,要求使用者重新提供使用者名稱和密碼。此外用fiddle抓取中間資料時,header中有如下資訊:,很明顯這是一個HTTP基本認證。

3、解決方案:這個實際是個post請求,和普通post的請求區別是:在每次請求資料時,需要用BASE64加密使用者名稱和密碼,並附加到請求頭中。requests庫提供了一個auth模組專門用於處理HTTP認證,這樣就不用程式自己做加密處理。下面給出具體程式碼:

知識點

目前有多種http登入驗證方法,其中最廣泛應用的是基本驗證和摘要驗證,auth模組也提供摘要驗證處理方法,具體使用方法我也沒有研究過,請各位查詢相關資料。

五、JavaScript動態頁面

前面介紹了靜態頁面和含有post表單網站的爬蟲方式,相對比較簡單。而實際在做網頁爬蟲工作時頁面情況更加多樣複雜。如:
1、網頁中包含javascript程式碼,需要經過渲染處理才能獲取原始資料;

2、網站具有一定反爬蟲能力,有些cookie是需要客戶端指令碼執行JS後才會產生,而requests模組又不能執行JS程式碼,如果我們按照第三部分操作來post表單,會發現部分少了部分cookie,導致請求被拒絕。在當前知名網站反爬蟲工作做的比較好,很難找到簡單post表單就可以。
那有什麼好的方式解決這種型別網站的爬蟲呢?

“python+ selenium + 第三方瀏覽器“。

示例

2、分析過程:

(1) 當我們使用python request庫去獲取伺服器原始碼時,發現python獲取的原始碼和瀏覽器上渲染出的場景不一樣,Python拿到是JS原始碼。如下圖:

Python有個第三方庫PyV8,該庫可以執行JS程式碼,但執行效率低,此外微軟官網還涉及JS加密的Cookie,若是採用requests + Pyv8 + BeautifulSoup 三種庫組合方式處理,那程式碼會顯得臃腫雜亂。

那是否有其他更為簡潔易懂的方式呢?

有, selenium。

(2)“Selenium+ 第三方瀏覽器”,可以讓瀏覽器自動載入頁面,由瀏覽器執行JS從而獲取到需要的資料,這樣我們的python程式碼就無需實現瀏覽器客戶端的功能。可以說,“Selenium + 第三方瀏覽器”組成了一個強大的網路爬蟲,可以處理cookie、javascript等頁面爬取情況。第三方瀏覽器分有介面(chrome)和無介面(PhantomJS),有介面瀏覽器就是可以直接看到瀏覽器被開啟以及跳轉的過程。無介面瀏覽器會將網站載入到記憶體並執行頁面上的JS,不會有圖形介面。可以自己喜好或者需求選擇第三方瀏覽器。

3、解決方案:採用“selenium+ chrome”方式完成需求。

(1)下載安裝python的selenium庫;

(2)下載chromeDriver到本地;

(3)利用webdriver api完成對頁面的操作。下面給出一個示例,完成微軟官網的登入。示例程式碼在初始化webdriver時設定了網路代理、指定了瀏覽器下載檔案儲存路徑、讓chrome提示下載進度等資訊。

知識點

在例項化webdriver時,可以通過引數對瀏覽器做些設定,如設定網路代理、瀏覽器下載檔案儲存路徑等。若是不傳引數,則預設繼承本地瀏覽器設定。若是對瀏覽器啟動時屬性進行設定,則就利用到了ChromeOption類。具體資訊可參考chromedriver官網。

“python + selenium + 第三方瀏覽器”可以處理多種爬蟲場景,包括靜態頁面,post表單,以及JS等。應用場景很強大,使用selenium操作瀏覽器進行模擬點選的方式就可以讓我們省心很多,不需要擔心有什麼“隱藏欄位”、cookie追蹤等。但對於包含驗證碼網頁的操作,這種方式也不好處理,主要困難在於影象識別。

六、總結

本文主要針對各網站特點給出不同的爬蟲方式,可以應對大量場景的資料爬取。在實際工作中使用頻率最多還是“靜態頁面”、“javascript動態頁面”這兩種。當然,若是頁面包含驗證碼,那就需要結合影象識別工具做些事情了,這種情況相對也比較難處理,影象識別準確率受到圖片內容影響。
這裡是個人的一些小總結,不知道大家是否有其他更好的方法呢?

大家若是有其他比較好的爬蟲案例,歡迎在評論區留言,大家一起學習交流!

瞭解更多測試相關乾貨 ,關注我們的微信公眾號——騰訊移動品質中心TMQ:
這裡寫圖片描述

相關推薦

TMQ如何輕鬆網頁資料

一、引言 在實際工作中,難免會遇到從網頁爬取資料資訊的需求,如:從微軟官網上爬取最新發布的系統版本。很明顯這是個網頁爬蟲的工作,所謂網頁爬蟲,就是需要模擬瀏覽器,向網路伺服器傳送請求以便將網路資源從網路流中讀取出來,儲存到本地,並對這些資訊做些簡單提取,將我們

TMQ這樣的測試過程管理讓你事半功倍

導語 相信每一位測試小夥伴對於測試過程管理都有自己的獨特見解。我所在的部門2017年初開始施行測試變革——“測試左移”。過程中有從技術層面的”左移“,也有從流程層面的”左移“等等,方式形態萬千。今天和大家分享的是我在這個過程中,除了個人技術能力提升外,在測試過

TMQ從0開始做後臺測試

從使用者反饋說起 “我備份的照片怎麼不見了”; “出現伺服器錯誤-1001”; “下載的照片無法顯示”。 使用者反饋,測試過程中經常遇到各種與後臺相關的非必現問題,對於一個重後臺功能的產品,包括很多業務邏輯和使用者的資料都與後臺強相關,若只是通過客戶端來

TMQ測試左移專欄用Powermock和Mockito來做安卓單元測試

作者:ZeusL 團隊:騰訊移動品質中心TMQ 一、單元測試及Android單元測試簡介 慣例,先簡單介紹下理論知識,懂得的可以跳過。 1、單元測試定義和特性 單測定義: 在計算機程式設計中,單元測試(Unit Testing)又稱為模組測試,

TMQ再不建模你就out了

導語 加入測試建模小組八個多月的時間,在日常的測試工作中,經常會有身邊的小夥伴們對我們的建模很好奇,會問“什麼是測試建模?”“為什麼要測試建模?”“建模能給我們帶來什麼好處?”“建模和我們現在的測試設計區別到底在哪裡?“等等諸如此類的問題。思來想去,實在有必要

TMQGoogle是如何做Chrome瀏覽器的效能測試的?

導語 近期研究了一下chrome的強大的效能測試工具telemetry,收穫頗豐,現簡單介紹一下telemetry的測試框架。telemetry中的很多方法都正在逐步的引入到自研的桌面QQ瀏覽器效能自動化測試系統中。 一、概述 Telemetry是一套

TMQ遠端移動測試平臺對比分析

作者:趙麗娜 隨著移動裝置和系統的碎片化程度越來越高以及複雜的行動網路情況, 相容性測試以及遠端真機測試的重要性越來越突出。根據遠端測試機/人員與開發者間的合作方式,可以分為以下幾種服務:雲測試服務、內測服務以及眾測服務,相應的平臺支援如下圖。 雲

TMQUTP自動化測試平臺系列之三用例管理

導語 UTP自動化測試平臺是TMQ的一個聯合專案,目的是方便各專案測試人員更好地開展自動化測試建設工作,減少重複平臺建設的成本,提高產品的自動化測試效率。 背景 測試用例,是測試的基礎原料,沒有用例,測試工作無法執行,自動化測試也是一樣。實際的自動化測

TMQJAVA程式碼覆蓋率工具JaCoCo-踩坑篇

作者:劉洋 一、覆蓋率踩過的坑 在專案中使用JaCoCo覆蓋率的時候,也遇到過各種奇葩的問題,在這裡列出來分享下,問題和實際的專案關係密切,希望對有遇到過相似問題的童鞋有所啟發。 1.1 覆蓋率包在部分手機6.0上安裝失敗 事情起因:在測試新功

TMQTTS評測--方案介紹和實踐分享

導讀 語音合成(Text To Speech,TTS)技術將文字轉化為聲音,目前廣泛應用於語音助手、智慧音箱、地圖導航等場景。TTS的實現涉及到語言學、語音學的諸多複雜知識,因合成技術的區別,不同的TTS系統在準確性、自然度、清晰度、還原度等方面也有著不一樣的

TMQ測試管理平臺大比拼

作者:solinazhao 簡介 測試管理平臺是貫穿測試整個生命週期的工具集合,它主要解決的是測試過程中團隊協作的問題,比如缺陷管理、用例管理、測試任務管理等。 目前市面上比較流行的測試管理工具有QC、 Mantis、 BugZilla、TestL

不會Python爬蟲?教你一個通用爬蟲思路輕鬆網頁資料

  前言 其實爬蟲的思路很簡單,但是對於很多初學者而言,看得懂,但是自己寫的時候就不知道怎麼去分析了!說實話還是寫少了,自己不要老是抄程式碼,多動手! 本人對於Python學習建立了一個小小的學習圈子,為各位提供了一個平臺,大家一起來討論學習Python。歡迎各位

CVM的功能和優勢學習總結

騰訊雲 騰訊雲的功能 騰訊雲的特點 騰訊雲的功能與優勢具有以下幾個方面:提供全面的服務彈性的雲端CVM的管理平臺可靠CVM極速的CVM性能多種解決方案來保證CVM和數據的安全簡單易用多種計費模式,降低IT投入成本騰訊雲CVM提供了全方面的服務內容,具體為以下幾類:實現了多region多zone覆蓋

自己搭建的雲伺服器JavaEE環境

轉載地址:https://www.cnblogs.com/qlqwjy/p/8727487.html 感覺很專業的樣子,還沒有看完,更沒有實踐,找個機會實踐一下。 0.安裝SSH登入 1.生成公鑰對 ssh-keygen -t rsa -P ''   -P表示密

開源iOS爆記憶體問題解決方案-OOMDetector元件

元件介紹 OOMDetector是手Q自研的IOS記憶體監控元件,騰訊內部目前已有多個App接入了OOMDetector,它主要有以下兩個功能: 爆記憶體堆疊統計:負責記錄程序記憶體分配堆疊和記憶體塊大小,在爆記憶體時Dump堆疊資料到磁碟 記憶體洩漏檢測

開源LivePool:基於Node.js的跨平臺Web抓包替換工具

LivePool 是一個基於 NodeJS,類似 Fiddler 能夠支援抓包和本地替換的 Web 開發除錯工具,是Tencent AlloyTeam 在開發實踐過程總結出的一套的便捷的工作流以及除錯方案。 背景 在 Windows 平臺上,Fiddler 作為一款非常便捷好用的 Web 除錯工具

地圖出現“鑑權失敗,請傳入正確的key”怎麼解決?

騰訊地圖使用中,出現了“鑑權失敗,請傳入正確的key”,需要到騰訊官方申請一個key. 如圖所示,複製KEY過來,找到報錯頁面,加上 <script charset="utf-8" src="h

汽車口碑分析3.汽車評論資料

環境配置 Ubuntu 16.04 Python 3.5 技術框架 Scrapy 需求目標 本專案為汽車口碑分析,第一步需要爬取對於不同車型的評論資料。 選擇58車的車型分類爬取評論資料。 爬取流程 先獲取每個車型的連結

人工智能AI:車牌識別停車場管理系統

運行 基於 臨時 所有 sig idt 51cto lis amp 車牌OCR接口 接口描述根據用戶上傳的車牌圖像,返回識別出的車牌字段信息。 請求參數參數名稱 是否必選 數據類型 數據約束 示例數據 描述app_id 是 int

一個月入門Python爬蟲學習,輕鬆大規模資料

利用爬蟲我們可以獲取大量的價值資料,從而獲得感性認識中不能得到的資訊,這篇文章給大家帶來了一個月入門Python學習,爬蟲輕鬆爬取大規模資料,感興趣的朋友一起看看吧 資料獲取方式:Python技術學習QQ群832339352 新增即可免費獲取! Python爬蟲為