人生苦短,我用 Python
引言各位同學大家好,好久不見(可能只有一兩天沒見:囧)~~~
先講一件事情,昨天為啥沒更新。
emmmmmmmmm,當然是因為加班啦,快到年底了,公司項目比較忙,最近的更新頻率會有下降,請各位海涵。
廢話不多說,開始今天的正題,從題目大家應該已經猜到了,小編要開始更新一個新的系列《小白學 Python 爬蟲》,介於大家水平參差不齊,建議沒有 Python 基礎第一次接觸的同學先看下小編之前更新的《小白學 Python 系列》,大致了解下 Python 的語法規則以及一些基礎用法。
先自己吹一波水,這個系列小編計劃做成長期更新系列,目前 Python 爬蟲涉及到的第三方的類庫有些多,還會有很多有關 web 編程方面的基礎知識,因面向的群體主要是小白,這些內容都需要一一介紹,這會是一個大的系列。額,遠超之前的 Python 基礎。
額,忘了件事兒,再加一句題外話,最近公眾號後臺留言有點略多,很多同學的問題來不及回復就被留言衝的看不到了,這裡請大家有問題可以添加小編的個人微信:allen_6174(放心加,這個是小編的個人生活微信號,和工作號是分開的)。
算了,順便再打個廣告吧:本爬蟲系列文章後續將於公眾號首發,個人博客站次日同步,第三方博客平臺不定期同步,泥萌要不要關注我一下呢?
什麼是爬蟲?不管是作為程式設計師還是小白,對爬蟲這個詞應該都不陌生,畢竟最近也發生了很多事情,很多人因為某些事情都進去了,具體情況我就不提了,容易被和諧。有想知道的同學可以翻一翻我之前公眾號轉的一篇文章《只因寫了一段爬蟲,公司200多人被抓!》。最近的網絡報導此類的新聞還有很多。
在正式內容開始之前,提醒各位讀者敬畏法律,熱愛生活。
老規矩,先百度一波看看百度釋義:
網絡爬蟲(又稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
講點接地氣的就是我們把平時使用的網絡看成是一張大蜘蛛網,每個站點看做是這張網上面的一個一個的節點,爬蟲好比是一隻蜘蛛,在這張網上面按照一定的或者已經設計好的路線,找到目標節點獲取所需資源。
為什麼使用爬蟲平時我們在上網的時候,看到一些感興趣的網絡資源,可以使用複製黏貼的方式將這些資源下載回來,比如看知乎的時候,一些回答很精彩的高贊回答,數據量小的時候,我們動動滑鼠右鍵也就搞定了,但是如果這種數據量非常大,有時候可以大到超出你的想像,再用滑鼠右鍵複製黏貼就有些捉襟見肘了。
這時,我們就需要勤勞的爬蟲出馬了,爬蟲這種「生物」,可以全天候24小時候不間斷工作,只需提供必要的網絡和電力,就可以一直勤勞的工作下去,讓你解放雙手,再也無需人工使用 CV 大法了。
可以看出,爬蟲非常適合幫我們做兩類事情:
大量數據的提取,在一定規則條件下。
完全自動化,無需人工過多幹預。
想像一下,當老闆讓你搜索某類信息時,寫一隻勤勞的小爬蟲,自己在旁邊泡上一杯清茶,拿起手機開始愉快的玩耍,時不時的看這隻爬蟲有沒有完成工作,這場景一下讓我想起了萬惡的資本家壓榨勞動力。
爬蟲的核心什麼是爬蟲,講點通俗易懂的,爬蟲就是爬取網頁,從中按照一定規則提取信息,重複以上過程自動化重複完成的程序。
一隻爬蟲,第一件事情就是要爬取網頁,這裡主要是指獲取網頁的原始碼。在網頁的原始碼裡,會含有我們所需要的信息,而我們要做的事情就是從原始碼中將這些信息提取出來。
我們請求網頁的時候, Python 為我們提供了很多庫來做這件事情,比如官方提供的 urllib ,以及第三方提供的 requests 、 Aiohttp 等。
我們可以使用這些庫來發送 HTTP 請求,獲取響應的數據,得到響應之後,我們只需要解析其中 body 部分的數據,就可以獲得網頁的原始碼。
獲取到原始碼以後,我們接下來的工作就是解析原始碼,從中提取出我們需要的數據。
提取數據最基礎也是最常用的是使用正則表達式的方式的,但是這種方式比較複雜,也比較容易出錯,不過不得不說,一個正則表達式寫的非常厲害的人,完全用不著下面的這些解析類庫,這是一個萬能的方法。
悄悄的說一句,小編的正則表達式寫的也不好,才會使用到這些由第三方提供的類庫。
用於提取數據的類庫有 Beautiful Soup 、 pyquery 、 lxml 等等。使用這些庫,我們可以高效快速地從 HTML 中提取網頁信息,如節點的屬性、文本值等。
從原始碼中提取到數據以後,我們會對數據進行保存,這裡的保存形式多種多樣,可以直接保存成 txt 、 json 、 Excel 文件等等,也可以保存至資料庫,如 Mysql 、 Oracle 、 SQLServer 、 MongoDB 等等。
一般而言,我們抓取到的都是 HTML 的網頁原始碼,這個是我們看得到的、常規的、直觀的網頁信息。
但是有些信息,並不是直接和 HTML 一起返回至網頁的,會存在各種各樣的 API 接口,這種接口返回的數據現在大多數是 JSON 的格式,也有一些會返回 XML 的數據格式,還會有一些個別的奇葩的接口直接返回程序猿自定義的字符串。這種 API 數據接口就需要具體問題具體分析了。
還有一些信息,比如各大圖片站、視頻站(如抖音、 B站),我們想要爬取的信息是圖片或者視頻,這些信息是已二進位的形式存在的,我們需要將這些二進位的數據爬取下來再進行轉儲。
此外,我們還能抓取到一些資源文件,如 CSS 、 JavaScript 等腳本資源,有的還會有一些 woff 等字體信息。這些信息是一個網頁組成不可或缺的元素,只要瀏覽器能訪問到的,我們都可以將其爬取下來。
現代前端頁面爬取今天核心內容來了!!!
很多時候,我們使用 HTTP 請求庫爬取網頁原始碼時,爬取到的信息和我們在網頁上看到的信息完全不一樣,只有短短的幾行。
這是因為最近這幾年,前端技術突飛猛進,大量的採用前端模塊化工具來構建前端頁面,比較常用的框架有 Vue 、 React 等等。
導致我們獲取到的網頁只有一個空殼子,例如這種:
<!DOCTYPE html>
<html lang="en" style="background-color: #26282A; height: 100%">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>演示項目</title>
</head>
<style>
html,
body,
#app {
height: 100%
}
</style>
<body>
<noscript>
<strong>We're sorry but xxxxxx doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<script src=/js/chunk-vendors.84ee7bec.js></script>
<script src=/js/app.4170317d.js></script>
</body>
</html>
代碼來源是博主平時做的一些小東西,其中博主已經省略大量引入的 JavaScript。
body 節點裡面只有一個 id 為 app 的節點,但是需要注意在 body 節點的最後引入了 JavaScript 文件,它們負責整個網頁的渲染。
在瀏覽器打開這個頁面後,首先會加載這個 HTML 的內容,接著會發現有 JavaScript 的腳本文件加載,獲取到這些腳本文件後,開始執行其中的代碼,而 JavaScript 腳本文件則會修改整個頁面的 HTML 代碼,向其中添加節點,從而完成整個頁面的渲染。
但是當我們使用請求庫去請求這個頁面的時候,只能獲得當前的 HTML 的內容,它並不會去幫我們獲取這個 JavaScript 腳本文件並且幫我們執行這個腳本文件渲染整個 HTML DOM 節點,我們當然也就看不到瀏覽器當中看到的內容。
這也解釋了為什麼有時我們得到的原始碼和瀏覽器中看到的不一樣。
當然,遇到這種情況也不要慌,我們還可以使用Selenium、Splash這樣的庫來實現模擬瀏覽器中的 JavaScript 渲染。
後面,我們會慢慢聊這些內容,本文主要先幫各位同學對爬蟲有一個基礎的了解,方便後續的學習。
參考:
https://cuiqingcai.com/5484.html