那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

叄公子KCN發表於2019-02-15

環境搭建

關於語言

對於網路爬蟲來說,其本質就是傳送http請求,然後提取網頁的內容資訊進行入庫分析等操作,所以對於任何語言都可以構建爬蟲應用。我曾經就用過C#、C++、Java、Swift、Golang、Python這些語言來編寫爬蟲應用。

總結來說,這裡還是最推薦python,其優點就是學習簡單,並且庫十分全面,編寫起程式碼來十分輕巧,另外python擁有豐富的機器學習庫、資料處理庫,如scikit-learn、numpy、pandas等等,可以用來處理我們爬取的資料。

本系列文章假設讀者已經掌握了python語言的最基本語法,並有一定的程式設計基礎。

關於程式碼編輯器

作為一門指令碼語言,python程式碼不需要編譯、連結等步驟,只需要使用python的直譯器解釋執行就好了,所以使用一個記事本就可以完成python的編碼工作。不過為了更加高效的編寫程式碼,程式設計師都會選擇一款程式碼編輯器。

如果對於python很熟悉,不需要程式碼拼寫提示等功能,其實使用常見的程式碼編輯器如AtomSublime Text 即可(當然如果配置外掛,這些編輯器也可以有強大的程式碼提示功能,不過新手配置起來可能會遇到困難)。

如果需要程式碼提示,我感覺用的最舒服的還是JetBrains系列的Pycharm更好用一些。我本身也主要在用Pycharm。

關於瀏覽器

瀏覽器除了瀏覽網頁以外,對爬蟲開發者來說還可以對網頁的Html元素、傳送的HTTP請求進行分析。市面上基本上所有的瀏覽器都支援這兩種功能,但是普遍來說用的最多的還是Chrome瀏覽器。

下面,我們首先通過Chrome瀏覽器下載一個weibo上的小視訊,來學習如何用Chrome瀏覽器抓取網路請求。

用Chrome抓取網路請求

視訊的連結:weibo.com/tv/v/FaOp9o…

開啟Chrome瀏覽器後,我們可以首先開啟一共空白頁面,然後右鍵,選擇檢查。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

點選檢查後,可以看到彈出一個Dock視窗,為了方便檢視頁面內容,我習慣把這個Dock視窗放在右邊。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

在這個Dock視窗中,有很多個選項卡,在本系列教程中,主要使用到Elements和NetWork這兩個,一個負責審查Html元素,一個負責記錄網路請求。目前需要使用網路抓取功能,所以先跳到Network這個選項卡中。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

下面,在瀏覽器中輸入視訊的連結並回車,就可以看到網頁載入出來了,其中的網路請求也記錄在了右邊。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

可以看到這些網路請求有html、css、js、圖片等等,點選一個條目後都可以看到請求的詳情,在這裡面其中有一個請求大小很大,並且在一直增長,可以想象這就是我們正在觀看的視訊檔案。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

我們點選這個請求可以看到請求的真實連結地址,這個地址中還帶了個mp4,顯然就是我們正在觀看的視訊檔案。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

我們把連結複製下來,在一個新的Tab中輸入連結後回車,可以看到已經把視訊下載到了本地。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

用本地的影音播放器開啟,和線上的一模一樣。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

爬蟲入門

學習了上面的小技巧,如果碰到你想下載的音樂、想下載的視訊,通過這種方法就可以下載下來(當然優酷、愛奇藝這樣的專門做視訊的網站已經規避了這種方法)。

下面,將正式開始學習網路爬蟲,本章將以nladuo.cn/scce_site/為例, 爬取它的通知公告的文字資訊。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

使用requests下載網頁

網頁主要由HTML、CSS、JavaScript程式碼以及圖片等資源組成,其中HTML控制頁面的結構,CSS控制頁面的樣式,JavaScript控制頁面的邏輯。對於目前大部分的網站,我們要爬取的文字資訊一般情況下都儲存在HTML中。(也有些網站使用JavaScript來控制頁面的結構和資訊,HTML中不存在需要爬取的資訊,我們將在反反爬蟲篇再詳細介紹這種情況。)

在python中,我們可以通過requests庫來下載一個網頁的html。比如說上面的這個連結,我們可以通過以下一行程式碼把網頁資訊下載下來,然後通過print列印它。

import requests

resp = requests.get("http://nladuo.cn/scce_site/")
print resp.content
複製程式碼

在執行程式碼前,請先使用pip安裝requests庫,使用以下命令即可完成對庫的安裝:

pip install requests
複製程式碼

執行程式碼後,可以看到顯示出一堆html的標籤。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

在瀏覽器中,也是先下載這樣的html頁面,然後根據html程式碼的結構展示到螢幕中的。

網頁結構

下面,我們來看看HTML如何對應到網頁的結構中的,我們先開啟這個網址然後使用chrome瀏覽器檢視一下這個網頁的結構,像上面的抓取網路請求一樣,我們按下右鍵然後選擇檢查,並在右邊彈出的選項卡中選擇Elements項。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

在Elements的左側有個箭頭,點選這個箭頭後,箭頭變為選中狀態。箭頭處於選中狀態時,用滑鼠滑動到左側的網頁中,可以看到右側對應的html資訊。

在上圖中,可以看到新聞資訊處在class為every_list的div標籤中。展開div的class為every_list標籤後,可以看到在class為list_title標籤下面的a標籤中,存放著新聞的連結(a.href),新聞的標題(a中間的文字);在class為list_time的標籤中,存放了新聞釋出的日期。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

使用BeautifulSoup解析Html

那麼,我們如何從HTML中提取這些文字呢?這裡可以使用HTML解析庫解析HTML的內容,常見的有BeautifulSoup,HtmlParser、PyQuery等等。

這裡,我們選用BeautifulSoup,還是先用pip安裝一下依賴。

pip install bs4
複製程式碼

在使用requests下載html後,我們把html傳給一個BeautifulSoup物件後,即可對html進行解析,使用find查詢指定元素。

import requests
from bs4 import BeautifulSoup

if __name__ == `__main__`:
    resp = requests.get("http://nladuo.cn/scce_site/")
    # print(resp.content)
    soup = BeautifulSoup(resp.content)
    items = soup.find_all("div", {"class": "every_list"})

    for item in items:
        title_div = item.find("div", {"class": "list_title"})
        title = title_div.a.get_text()
        url = title_div.a["href"]
        time = item.find("div", {"class": "list_time"}).get_text()
        print(time, title, url)
複製程式碼

在上面程式碼中,使用find_all方法首先找到所有的class為every_list的div標籤,然後對div進行遍歷,逐個列印每個標籤下面的list_title和list_time。(更詳細的API,讀者可以查閱BeautifulSoup的文件。)

執行上述程式碼後,成功列印出了新聞的基本資訊。

那些年,我爬過的北科(一)——爬蟲基礎之環境搭建與入門

至此,我們的第一個爬蟲也就完成了。

相關文章