一、前言
3年前,我在 csdn 寫過 Python3 網絡爬蟲系列教程,經過三年的積累,累計閱讀量近 90W。
同時,我也在 Github 開源了所有 Python3 網絡爬蟲代碼,累積獲得 10.3k+ 的 star,4.1k+ 的 fork。
可以說,這個系列教程算是比較成功的,在全國的開源網絡爬蟲教程項目中,也是排在前幾名的。
但是,由於時間太長了,陸陸續續,很多實戰示例也早已失效。
網絡爬蟲,是一門比較通用的基礎技術,各個領域都會有所涉及,比如我做視覺算法的,也需要用到網絡爬蟲,例如調用 API 接口清洗數據等,這本質也都是一個小的爬蟲程序。
爲了提供各位更好的學習示例,我決定重寫這一系列教程,對一些失效的示例,重新找例子,並查缺補漏,完善這一些列教程。
2020年,最新版的 Python3 網絡爬蟲實戰系列教程,我會首發在公衆號和個人網站上。
公衆號:
下面進入正題,回到3年前最初的起點,開啓 Python3 網路爬蟲實戰的第一篇:初識網絡爬蟲。
二、網絡爬蟲簡介
網絡爬蟲,也叫網絡蜘蛛(Web Spider)。它根據網頁地址(URL)爬取網頁內容,而網頁地址(URL)就是我們在瀏覽器中輸入的網站鏈接。
例如:https://www.baidu.com
URL 專業一些的叫法是統一資源定位符(Uniform Resource Locator),它的一般格式如下(帶方括號[]的爲可選項):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL 的格式主要由前個三部分組成:
- protocol:第一部分就是協議,例如百度使用的就是https協議;
- hostname[:port]:第二部分就是主機名(還有端口號爲可選參數),一般網站默認的端口號爲80,例如百度的主機名就是www.baidu.com,這個就是服務器的地址;
- path:第三部分就是主機資源的具體地址,如目錄和文件名等。
網絡爬蟲就是根據這個 URL 來獲取網頁信息的。
還是,以百度爲例,舉個簡單的例子:
http://www.baidu.com:80
https://www.baidu.com:443
這兩個 URL 都可以打開網頁,區別在於一個是 http 協議,一個是 https 協議。
http 協議默認使用的端口是 80,https 協議默認使用的端口是 443。
每一個 URL 的背後,其實都是對應着一臺服務器的,甚至成千上萬臺。
通俗一點講,URL 就是每個服務器的地址。例如,老王家住在北京市朝陽區,老李家住在北京市海淀區。
你想串門溜達去,就得通過這個 URL 家庭地址,找到他們。
如果有一天,你想去老王家,跟他老婆聊聊天,你僅僅知道老王家住在北京市朝陽區是不夠的。
因爲,你還得知道他家在哪個樓,幾單元,幾零幾。
對應 ULR 上,也就是你光知道 hostname 不夠,你還得有個更詳細的地址,那就得補充 path:
https://cuijiahua.com/blog/spider/
比如,cuijiahua.com 是我的 hostname,想找到爬蟲系列的文章,還得去 blog 目錄下的 spider 目錄下找,這個就是具體的地址 path。
老王家的詳細家庭住址知道了,如果你還想夜晚去,並且趁着老王不在,與老王的老婆聊聊天。
那這個情況就有點複雜了。不僅需要知道 protocol 、hostname 和 path,你還得滿足一些條件,這個條件就是 [;parameters][?query]#fragment,這些東西。
比如,爲了完成此次夜探老王家的目標,你可能大概需要這樣的 URL:
https://chaoyanglaowang.com/2haolou/3danyuan/702/s?laowangzaiji=0&baitian=0
這個 URL 的意思就是,baitian=0表明是晚上,laowangzaiji=0表示老王不在家,在滿足這個條件的時候,你進了2號樓3單元702的朝陽區老王家,就可以夜探老王家了。
?laowangzaiji=0&baitian=0,這是一種詢問,在這個條件下訪問。
夠通俗易懂了吧!
三、審查元素
在講解爬蟲內容之前,我們需要先學習一項寫爬蟲的必備技能:審查元素。
在瀏覽器的地址欄輸入 URL 地址,在網頁處右鍵單擊,找到檢查。(不同瀏覽器的叫法不同,Chrome 瀏覽器叫做檢查,Firefox 瀏覽器叫做查看元素,但是功能都是相同的)
我們可以看到,右側出現了一大推代碼,這些代碼就叫做 HTML 。什麼是 HTML ?舉個容易理解的例子:我們的基因決定了我們的原始容貌,服務器返回的 HTML 決定了網站的原始容貌。
爲啥說是原始容貌呢?因爲人可以整容啊!扎心了,有木有?那網站也可以"整容"嗎?可以!請看下圖:
我能有這麼多錢嗎?顯然不可能。我是怎麼給網站"整容"的呢?就是通過修改服務器返回的 HTML 信息。我們每個人都是"整容大師",可以修改頁面信息。我們在頁面的哪個位置點擊審查元素,瀏覽器就會爲我們定位到相應的 HTML 位置,進而就可以在本地更改 HTML 信息。
再舉個小例子:我們都知道,使用瀏覽器"記住密碼"的功能,密碼會變成一堆小黑點,是不可見的。可以讓密碼顯示出來嗎?可以,只需給頁面"動個小手術"!以淘寶爲例,在輸入密碼框處右鍵,點擊檢查。
可以看到,瀏覽器爲我們自動定位到了相應的 HTML 位置。將下圖中的 password 屬性值改爲 text屬性值(直接在右側代碼處修改):
我們讓瀏覽器記住的密碼就這樣顯現出來了:
說這麼多,什麼意思呢?瀏覽器就是作爲客戶端從服務器端獲取信息,然後將信息解析,並展示給我們的。我們可以在本地修改 HTML 信息,爲網頁"整容",但是我們修改的信息不會回傳到服務器,服務器存儲的 HTML 信息不會改變。刷新一下界面,頁面還會回到原本的樣子。這就跟人整容一樣,我們能改變一些表面的東西,但是不能改變我們的基因。
四、簡單實例
網絡爬蟲的第一步就是根據 URL ,獲取網頁的 HTML 信息。在 Python3 中,可以使用 urllib.request 和 requests 進行網頁爬取。
- urllib 庫是 Python 內置的,無需我們額外安裝,只要安裝了 Python 就可以使用這個庫。
- requests 庫是第三方庫,需要我們自己安裝。
requests 庫強大好用,後續文章的實例,也都是以此爲基礎進行講解。requests 庫的 github 地址:
https://github.com/requests/requests
1、requests 安裝
在 cmd 中,使用如下指令安裝 requests :
pip install requests
或者:
easy_install requests
2、簡單示例
requests 庫的基礎方法如下:
官方中文教程地址:點擊查看
requests 庫的開發者爲我們提供了詳細的中文教程,查詢起來很方便。
首先,讓我們看下 requests.get() 方法,它用於向服務器發起 GET 請求,不瞭解 GET 請求沒有關係。
我們可以這樣理解:get 的中文意思是得到、抓住,那這個 requests.get() 方法就是從服務器得到、抓住數據,也就是獲取數據。讓我們看一個例子(以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() 方法必須設置的一個參數就是 url ,因爲我們得告訴 GET 請求,我們的目標是誰,我們要獲取誰的信息。運行程序看下結果:
這,就是最簡單的,網絡爬蟲。
五、總結
本文對網絡爬蟲的基礎進行了講解,此係列文章爲該系列的開篇之作。
後續的文章,會以生動有趣的實例,帶大家一起玩轉 Python3 網絡爬蟲。
參考鏈接(我參考我自己):
- https://blog.csdn.net/c406495762/article/details/78123502
- https://blog.csdn.net/c406495762/article/details/58716886