人生苦短,我用 Pythonhtml
前文傳送門:前端
小白學 Python 爬蟲(1):開篇正則表達式
小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝sql
小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門數據庫
小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門json
小白學 Python 爬蟲(5):前置準備(四)數據庫基礎瀏覽器
小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝app
什麼是爬蟲,講點通俗易懂的,爬蟲就是爬取網頁,從中按照必定規則提取信息,重複以上過程自動化重複完成的程序。
一隻爬蟲,第一件事情就是要爬取網頁,這裏主要是指獲取網頁的源代碼。在網頁的源代碼裏,會含有咱們所須要的信息,而咱們要作的事情就是從源代碼中將這些信息提取出來。
咱們請求網頁的時候, 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>
<!-- built files will be auto injected -->
<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