Python爬蟲原理解析

筆者公衆號:技術雜學鋪

筆者網站:mwhitelab.com

本文將從何爲爬蟲、網頁結構、python代碼實現等方面逐步解析網絡爬蟲。

1. 何爲爬蟲

如今互聯網上存儲着大量的信息。

作爲普通網民,我們常常使用瀏覽器來訪問互聯網上的內容。但若是想要批量下載散佈在互聯網上的某一方面的信息(如某網站的所有圖片,某新聞網站的所有新聞,又或者豆瓣上所有電影的評分),人爲的使用瀏覽器挨個打開網站搜查則過於費時費力。

人爲統計過於耗時耗力。

因此,編寫程序來自動抓取互聯網上我們想要的特定內容的信息則變得尤爲重要。

網絡爬蟲,是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。

我們通過程序,模擬瀏覽器向服務器發送請求、獲取信息、分析信息並儲存我們想要的內容

百度/google等搜索網站就是用採用爬蟲的方式,定期搜索互聯網上的鏈接並更新其服務器,這樣我們才能通過搜索引擎搜到我們想要的信息。

2. 網頁結構

訪問網頁遠非我們輸入地址後就看到網頁這麼簡單。

在瀏覽器中按“F12”,或者右鍵網頁,選擇“檢查”。即可看到網頁背後的代碼。

這裏以谷歌的Chrome瀏覽器爲例,在任意一個網站,我們按下F12,會出現一個瀏覽器的檢查窗口。默認的Elements窗口爲當前界面的HTML代碼。

網頁和Elements界面

Sources界面會顯示瀏覽器從各服務器下載的所有文件。

Sources界面

Network界面,在“Record Network log”狀態下(按Ctrl+E可切換該狀態)可以記錄瀏覽器在各個時間段依次收到的文件和文件的相關數據。

Network界面

我們這裏要實現的選取特定信息的爬蟲,需要我們先到對應網站去分析其網頁的結構。根據網頁結構對症下藥,編寫對應的程序,才能獲取我們想要的信息。

3. python代碼實現

我們將會以爬取豆瓣上《流浪地球》電影的影評爲例,逐步講解python爬蟲的實現方法(使用python3)。以下代碼可在github下載

3.1 基礎介紹

本節我們會用到的python的庫有:

  • requests:用於向服務器發送請求並獲取數據
  • json:用於分析json格式的數據
  • bs4:用於分析html數據(pip install Beautifulsoup4 安裝)
  • pandas:用於分析數據

除此之外,本節中我們沒有講到,但是平常使用爬蟲時可能會用到的庫還有:

  • sqlite3: 輕量級數據庫
  • re:用於進行正則表達式匹配

上述python庫,bs4可用”pip install Beautifulsoup4″指令安裝,其他庫可用”pip install 庫名詞”來直接安裝。

我們先新建一個jupyter文件,導入必要的python庫。

導入必要python庫

3.2 requests的使用

使用requests

上述代碼讓我們以程序的方式訪問了www.baidu.com(百度)網頁。

其中 “requests.get( 
.find(“標籤名”) 網頁地址)” 即是以get的方式去訪問網頁。

訪問網頁地址分爲get和post兩種。get和post的區別可見下圖(來自w3school)二者區別簡單瞭解即可,無需深究。

get和post兩種HTTP請求方法

關於get、post、使用requests傳參更操作,我們會在以後的高級爬蟲教程中逐一講述。

我們已經使用”response = requests.get(url)”將獲得到的信息傳入到”response”中。但是如果我們輸出response,得到的不是網站的代碼,而是響應狀態碼。

響應狀態碼

響應狀態碼錶示我們之前requests請求的結果。常見的有200,代表成功;403,無權限訪問;404文件不存在;502,服務器錯誤。

想要看到我們之前使用”requests.get(url)”得到的網頁內容。我們需要先進行”response.enconding = ‘utf-8’ “,該步驟是將得到的網頁內容進行utf-8編碼,否則我們看不到網頁中的中文。

對得到的內容進行utf-8編碼

之後輸入response.text,我們就能看到網頁的代碼了。

3.3 BeautifulSoup的使用

使用BeautifulSoup之前,建議讀者對html有一定的瞭解。若沒有,也無妨。

HTML是一種標記語言,有很強的結構要求。

html代碼示例

我們使用BeautifulSoup對HTML網頁的結構進行分析,從而選出我們想要的內容。

我們使用BeautifulSoup(response.text, “lxml”)即可對我們之前得到的網頁代碼進行自動分析。分析結果保存在等號左邊的變量soup中。

對html內容信息分析

BeautifulSoup的使用方法有很多。

比如 .find(“標籤名”) 返回找到的第一個該標籤的內容。

.find(“標籤名”)

值得注意的是,我們找到的第一個div標籤裏面還有div標籤。不過BeautifulSoup不會注意到這些,.find(“div”)只會返回第一個找到的div標籤,以及該標籤內的所有內容。

.find_all(“標籤名”)則是返回找到的全部標籤。

.find_all(“標籤名”)

.find_all(“標籤名”, class_=”類名”, id=”id名”) 可找到指定類別,指定id的標籤。(注意是使用class_而非class)

.find_all(“標籤名”, class_=”類名”, id=”id名”)

除此之外,我們還可以對.find(),.find_all()的結果繼續進行.find(),.find_all()的查詢。

3.4 json的使用

除了html格式的文件,我們還常常需要爬取一些json格式的文件。json是一種輕量級的數據交換格式。

html與json格式文件的區別如下圖。(嚴格來講,左側應該爲XML格式文件。但大體上也可以認爲是HTML)

html與json格式文件的區別 
(該圖來自於網絡)

於是,有的時候,我們對json格式的數據進行解析。

使用 text = json.loads(字符串格式的json數據)

即可將字符串格式的json數據轉換爲python的字典格式。

3.5 綜合使用

我們之前提到:“根據網頁結構對症下藥,編寫對應的程序,才能獲取我們想要的信息。”

現在,我們前往豆瓣影評中《流浪地球》的短評界面。(https://movie.douban.com/subject/26266893/comments)

《流浪地球》短評界面

我們按下”F12″,打開檢查界面。若是使用Chrome瀏覽器,可以點擊如下圖的小箭頭或者Ctrl+Shift+C,此時,鼠標移動到頁面中某一位置時,瀏覽器會自動顯示出該位置對應的代碼位置。

Ctrl+Shift+C 後可查看頁面中各元素的位置

具體效果如下:

結合我們之前所講的requests、Beautifulsoup的相應知識。讀者可以自己嘗試寫一個爬蟲,來獲取當前網頁的所有短評信息。

筆者這裏爬取的是”https://movie.douban.com/subject/26266893/comments?start=0&limit=20&sort=new_score&status=P&comments_only=1″,是一個json文件,所以額外用到了python的json庫。

代碼如下。完整代碼可在github上查看。這裏建議讀者先自己試着從零寫一個爬蟲,遇到問題先百度/google一下,最後再參照這個完整爬蟲代碼

完整爬蟲代碼

3.6 最終結果

最後,爲了最終結果美觀一點,筆者這裏使用了pandas的DataFrame

使用pandas的DataFrame

爬取的數據結果如下

爬取的數據

3.7 拓展

以上的內容僅僅是基礎的python爬蟲。

若是讀者細心,會發現在未登錄豆瓣的情況下無法訪問” 
https://movie.douban.com/subject/26266893/comments?start=220&limit=20&sort=new_score&status=P&comments_only=1 “

沒有權限

這裏url鏈接中start=220,也就是說在未登錄的情況下我們無法查看第220條評論以後的內容。

在以後的高級爬蟲教程中,我們會介紹如何使用爬蟲來進行登錄、保存cookie等操作。

除此之外,有些網站可能會使用js進行網站動態渲染、代碼加密等等,光光爬取html和json文件是不夠的。同時,我們還可以使用多進程來加快爬蟲的速度……

敬請期待之後的高級爬蟲教程。

文章會第一時間在公衆號更新

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