一、爬蟲爬取網頁的基本思路
1、獲取網頁:
通過 urllib、requests等庫完成 HTTP 的請求操作,得到響應之後我們只需要解析數據結構中的 Body 部分即可。
2、提取信息:
-
正則表達式提取:
通用方法,但是遇到正則表達式比較複雜的時候,提取的過程中容易出錯。
-
運用 CSS 選擇器和 XPath 進行提取:
運用如:Beautiful、soup、pyquery、lxml 等庫,我們可以快速提取網頁信息,如:節點屬性、文本值等。
3、保存數據:
- 可以將提取出來的數據保存到 TXT 文本或者 JSON 文本中;
- 也可以保存到數據庫中,例如:MySQL 和 MongoDB 等;
- 。0或者保存到遠程服務器中,如:藉助 SFTP 進行操作;
4、自動化程序:
將爬蟲程序自動化,使其可以自動爬取我們需要的信息,並能進行對各種異常的處理、錯誤重試的操作等,確保爬蟲能持續、高效的運行。
二、常見的爬取到數據
- 最常見的常規網頁返回的就是 HTML 源代碼;
- 有些網站返回的可能是一個JSON字符串(其中 API 接口大多采用這樣的形式),這類數據更容易抓取,而且更容易進行保存;
- 我們還有可能會看到各種二進制數據,如:圖片、視頻和音頻等,我們可以將這類數據爬取下來,然後保存成對應的文件名;
- 另外我們還能看到各種擴展名的文件,如:CSS、JavaScript 和配置文件等;
三、JavaScript 渲染頁面
在抓取信息時,時常能看到抓取到的信息可能和實際在瀏覽器中看到的源碼不一樣。這是因爲現在的網頁越來越多的採用 Ajax、前端模塊化工具來構建,整個網頁可能都是由 JavaScript 渲染出來的,即原始的 HTML 代碼就是一個空殼,如:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>This is a Demo</title>
</head>
<body>
<div id="container">
</div>
</body>
<script src="app.js"></script>
</html>
body 節點中只有一個 id 爲 container 的節點,但是 body 節點後引入了 app.js ,它負責渲染整個網站。
渲染過程:
瀏覽器打開這個網頁時:
- 先加載 HTML 內容,然後引入 app.js 文件並對這個文件進行請求;
- 獲得該文件之後,執行其中的 JavaScript 代碼;
- JavaScript 代碼則會改變 HTML 中的節點,向其中添加內容,
但是爬蟲用 urllib 或 requests 庫請求頁面是,只能得到 HTML 代碼,並不會繼續加載 JavaScript 文件,爬蟲也就得不到真正的源代碼。對於這樣的情況,我們可以分析後臺的 Ajax 接口,也可以使用 Selenium、Splash 這樣的庫來實現模擬 JavaScript 渲染。