初識網(wǎng)絡爬蟲之夜探老王家

一、前言
3年前,我在 csdn 寫過 Python3 網(wǎng)絡爬蟲系列教程,經(jīng)過三年的積累,累計閱讀量近 90W。

同時,我也在 Github 開源了所有 Python3 網(wǎng)絡爬蟲代碼,累積獲得 10.3k+ 的 star,4.1k+ 的 fork。

可以說,這個系列教程算是比較成功的,在全國的開源網(wǎng)絡爬蟲教程項目中,也是排在前幾名的。
但是,由于時間太長了,陸陸續(xù)續(xù),很多實戰(zhàn)示例也早已失效。

網(wǎng)絡爬蟲,是一門比較通用的基礎技術,各個領域都會有所涉及,比如我做視覺算法的,也需要用到網(wǎng)絡爬蟲,例如調(diào)用 API 接口清洗數(shù)據(jù)等,這本質(zhì)也都是一個小的爬蟲程序。
為了提供各位更好的學習示例,我決定重寫這一系列教程,對一些失效的示例,重新找例子,并查缺補漏,完善這一些列教程。
2020年,最新版的 Python3 網(wǎng)絡爬蟲實戰(zhàn)系列教程。
下面進入正題,回到3年前最初的起點,開啟 Python3 網(wǎng)路爬蟲實戰(zhàn)的第一篇:初識網(wǎng)絡爬蟲。
二、網(wǎng)絡爬蟲簡介
網(wǎng)絡爬蟲,也叫網(wǎng)絡蜘蛛(Web Spider)。它根據(jù)網(wǎng)頁地址(URL)爬取網(wǎng)頁內(nèi)容,而網(wǎng)頁地址(URL)就是我們在瀏覽器中輸入的網(wǎng)站鏈接。
例如:https://www.baidu.com
URL 專業(yè)一些的叫法是統(tǒng)一資源定位符(Uniform Resource Locator),它的一般格式如下(帶方括號[]的為可選項):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL 的格式主要由前個三部分組成:
protocol:第一部分就是協(xié)議,例如百度使用的就是https協(xié)議;
hostname[:port]:第二部分就是主機名(還有端口號為可選參數(shù)),一般網(wǎng)站默認的端口號為80,例如百度的主機名就是www.baidu.com,這個就是服務器的地址;
path:第三部分就是主機資源的具體地址,如目錄和文件名等。
網(wǎng)絡爬蟲就是根據(jù)這個 URL 來獲取網(wǎng)頁信息的。
還是,以百度為例,舉個簡單的例子:
http://www.baidu.com:80
https://www.baidu.com:443
這兩個 URL 都可以打開網(wǎng)頁,區(qū)別在于一個是 http 協(xié)議,一個是 https 協(xié)議。
http 協(xié)議默認使用的端口是 80,https 協(xié)議默認使用的端口是 443。
每一個 URL 的背后,其實都是對應著一臺服務器的,甚至成千上萬臺。
通俗一點講,URL 就是每個服務器的地址。例如,老王家住在北京市朝陽區(qū),老李家住在北京市海淀區(qū)。
你想串門溜達去,就得通過這個 URL 家庭地址,找到他們。
如果有一天,你想去老王家,跟他老婆聊聊天,你僅僅知道老王家住在北京市朝陽區(qū)是不夠的。
因為,你還得知道他家在哪個樓,幾單元,幾零幾。
對應 ULR 上,也就是你光知道 hostname 不夠,你還得有個更詳細的地址,那就得補充 path:
https://cuijiahua.com/blog/spider/
比如,cuijiahua.com 是我的 hostname,想找到爬蟲系列的文章,還得去 blog 目錄下的 spider 目錄下找,這個就是具體的地址 path。
老王家的詳細家庭住址知道了,如果你還想夜晚去,并且趁著老王不在,與老王的老婆聊聊天。

那這個情況就有點復雜了。不僅需要知道 protocol 、hostname 和 path,你還得滿足一些條件,這個條件就是 [;parameters][?query]#fragment,這些東西。
這個 URL 的意思就是,baitian=0表明是晚上,laowangzaiji=0表示老王不在家,在滿足這個條件的時候,你進了2號樓3單元702的朝陽區(qū)老王家,就可以夜探老王家了。
?laowangzaiji=0&baitian=0,這是一種詢問,在這個條件下訪問。
夠通俗易懂了吧!
三、審查元素
在講解爬蟲內(nèi)容之前,我們需要先學習一項寫爬蟲的必備技能:審查元素。
在瀏覽器的地址欄輸入 URL 地址,在網(wǎng)頁處右鍵單擊,找到檢查。(不同瀏覽器的叫法不同,Chrome 瀏覽器叫做檢查,F(xiàn)irefox 瀏覽器叫做查看元素,但是功能都是相同的)

我們可以看到,右側出現(xiàn)了一大推代碼,這些代碼就叫做 HTML 。什么是 HTML ?舉個容易理解的例子:我們的基因決定了我們的原始容貌,服務器返回的 HTML 決定了網(wǎng)站的原始容貌。

為啥說是原始容貌呢?因為人可以整容啊!扎心了,有木有?那網(wǎng)站也可以"整容"嗎?可以!請看下圖:

我能有這么多錢嗎?顯然不可能。我是怎么給網(wǎng)站"整容"的呢?就是通過修改服務器返回的 HTML 信息。我們每個人都是"整容大師",可以修改頁面信息。我們在頁面的哪個位置點擊審查元素,瀏覽器就會為我們定位到相應的 HTML 位置,進而就可以在本地更改 HTML 信息。
再舉個小例子:我們都知道,使用瀏覽器"記住密碼"的功能,密碼會變成一堆小黑點,是不可見的??梢宰屆艽a顯示出來嗎?可以,只需給頁面"動個小手術"!以淘寶為例,在輸入密碼框處右鍵,點擊檢查。

可以看到,瀏覽器為我們自動定位到了相應的 HTML 位置。將下圖中的 password 屬性值改為 text屬性值(直接在右側代碼處修改):

我們讓瀏覽器記住的密碼就這樣顯現(xiàn)出來了:

說這么多,什么意思呢?瀏覽器就是作為客戶端從服務器端獲取信息,然后將信息解析,并展示給我們的。我們可以在本地修改 HTML 信息,為網(wǎng)頁"整容",但是我們修改的信息不會回傳到服務器,服務器存儲的 HTML 信息不會改變。刷新一下界面,頁面還會回到原本的樣子。這就跟人整容一樣,我們能改變一些表面的東西,但是不能改變我們的基因。
四、簡單實例
網(wǎng)絡爬蟲的第一步就是根據(jù) URL ,獲取網(wǎng)頁的 HTML 信息。在 Python3 中,可以使用 urllib.request 和 requests 進行網(wǎng)頁爬取。
urllib 庫是 Python 內(nèi)置的,無需我們額外安裝,只要安裝了 Python 就可以使用這個庫。
requests 庫是第三方庫,需要我們自己安裝。
requests 庫強大好用,后續(xù)文章的實例,也都是以此為基礎進行講解。requests 庫的 github 地址:
https://github.com/requests/requests
1、requests 安裝
在 cmd 中,使用如下指令安裝 requests :
pip install requests
或者:
easy_install requests
2、簡單示例
requests 庫的基礎方法如下:

官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
requests 庫的開發(fā)者為我們提供了詳細的中文教程,查詢起來很方便。
首先,讓我們看下 requests.get() 方法,它用于向服務器發(fā)起 GET 請求,不了解 GET 請求沒有關系。
我們可以這樣理解:get 的中文意思是得到、抓住,那這個 requests.get() 方法就是從服務器得到、抓住數(shù)據(jù),也就是獲取數(shù)據(jù)。讓我們看一個例子(以fanyi.baidu.com為例)來加深理解:
# -*- coding:UTF-8 -*-?
import requests?
if __name__ == '__main__':?
????target = "http://fanyi.baidu.com/"
????req = requests.get(url = target)?
????req.encoding = 'utf-8' print(req.text)
requests.get() 方法必須設置的一個參數(shù)就是 url ,因為我們得告訴 GET 請求,我們的目標是誰,我們要獲取誰的信息。運行程序看下結果:

這,就是最簡單的,網(wǎng)絡爬蟲。
五、總結
本文對網(wǎng)絡爬蟲的基礎進行了講解,此系列文章為該系列的開篇之作。
后續(xù)的文章,會以生動有趣的實例,帶大家一起玩轉 Python3 網(wǎng)絡爬蟲。