Python3 網絡爬蟲(一):初識網絡爬蟲之夜探老王家(2020年最新版)

一、前言

3年前,我在 csdn 寫過 Python3 網絡爬蟲系列教程,經過三年的積累,累計閱讀量近 90W

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

可以說,這個系列教程算是比較成功的,在全國的開源網絡爬蟲教程項目中,也是排在前幾名的。

但是,由於時間太長了,陸陸續續,很多實戰示例也早已失效

網絡爬蟲,是一門比較通用的基礎技術,各個領域都會有所涉及,比如我做視覺算法的,也需要用到網絡爬蟲,例如調用 API 接口清洗數據等,這本質也都是一個小的爬蟲程序。

爲了提供各位更好的學習示例,我決定重寫這一系列教程,對一些失效的示例,重新找例子,並查缺補漏,完善這一些列教程。

2020年,最新版的 Python3 網絡爬蟲實戰系列教程,我會首發在公衆號個人網站上。

公衆號:

個人網站:https://cuijiahua.com/

下面進入正題,回到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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章