【個人記錄】零基礎python爬蟲練習——七行程式碼爬取豆瓣一週口碑榜

馬也BenJok發表於2019-04-01

本文用於記錄我自己的第一次python爬蟲練習,用七行程式碼來爬取豆瓣一週口碑榜。在這個練習中,我主要使用了python的requests庫和lmxl庫。兩者都是較容易上手的python網頁爬蟲第三方庫。由於我是真的零基礎,只知道一些python的基本語法,所以即使在有程式碼參考的情況下也遇到了一些問題,我通過這篇文章來對上次的經歷進行回顧。

起因

最近在進行python的學習,已經寫了一些例如陣列排序,猜數字小遊戲的小型程式,不過我一直沒有接觸過爬蟲(因為比較拖延,在廖雪峰的python教程上還沒有學到爬蟲的部分)。這次開始我的練習是因為在微信上看見了一篇文章,講七行程式碼爬取豆瓣一週口碑榜,看完心想:“這很容易嘛,那就拿他作為我的第一個爬蟲專案了”,於是我就開啟idle,建立一個新的py檔案,開始跟著教程走。

經過

整個爬蟲的開發過程分為編碼,解決問題和增加功能三部分。一開始以為只會花一點點時間(就和以為寫這篇文章只會花一點點時間一樣),當然事實證明,剛開始玩兒爬蟲,還是沒那麼輕鬆的,總會遇到些問題。不過,解決問題的過程也是很快樂的。

相關程式碼

先貼上我教程中一開始展示的程式碼(註釋是我自己加的,稍後會調重點解釋),程式碼確實只有七行,雖然在那篇微信文章上程式碼縮排出了問題,顯示只有六行,我剛開始還愣了一下。

#引入兩個第三方庫
import requests
from lxml import html
#需爬取的網頁地址
url = 'https://movie.douban.com/'
#訪問網頁
page = requests.Session().get(url)
#解析網頁內容
tree = html.fromstring(page.text)
result = tree.xpath('//td[@class=”title”]//a/text()')
print(result)

看了看程式碼,簡單吧?我重點來說說第六行的程式碼,此處引用文章原文的解釋:

//td :這個相當於大目錄;
[@class=”title”]:這個相當於小目錄;
//a :這個相當於最小的目錄;
/text():這個是提取其中的文字內容。

如果沒理解,那我先訪問一下網址: movie.douban.com, 到達頁面後按下F12,找到我要爬取的內容(電影名稱)的所在位置,即檢視該網頁的DOM結構(此處涉及到一點點HTML知識)。
找到榜單位置
找到電影名稱位置
從以上兩張圖可以看到,我要爬取的電影名稱位置是在class="title"的標籤< td >內部的標籤< a >中。也就是說,剛才的第六行程式碼是基於檢視了口碑榜位置,獲取到其DOM結構後編寫的(原教程中也有提到)。

然而,當我在IDLE中制行了相關程式碼後,出了問題,首先提示詞法錯誤,根據錯誤資訊提示,我意識到我使用的用的requests和lxml都是第三方庫,需要自行安裝。

問題解決

既然問題找到了,那麼解決起來就容易了,接下來就是面向搜尋引擎程式設計了(滑稽)。查到requests和lxml的安裝指令,以此在windows控制檯輸入:

pip install requests
pip install lxml

安裝完成後再次執行,emmmm,又報錯。根據錯誤資訊(缺失某個包),我瞭解到requests包的安裝比較複雜,因為它的配置依賴了urllib3,chardet,certifi等包,因此我要想成功引用requests包,還需要安裝其依賴包。我自己只遇到兩個缺失的包,一個是urllib3, 一個是chardet。因此最終通過在命令列輸入兩個安裝指令解決問題。

pip install urllib3
pip install chardet

安裝完成,重跑程式碼,得到了想要的結果,IDLE中以List的方式列印出了豆瓣一週的口碑榜,如圖所示。
執行結果

程式功能增加

教程部分走完了,不過感覺這樣還不夠。我想再練習一下python的檔案操作,因此我新增了以下幾行程式碼,來實現將口碑榜的內容寫入一個名為result.txt的文字檔案中。

resFile = open("result.txt", 'w')
resFile.write(str(result))
resFile.close()

再次執行程式碼後,py檔案所在目錄出現了一個名為result.txt的檔案,其內容和IDLE中列印的內容相同。
生成result.txt檔案檔案內容

總結

以此,我的第一個python爬蟲練習就完成了,相對來說是比較簡單的,不過能實現一個小玩爬蟲,還是有一點謎之成就感,夠我驕傲三秒鐘了。

我在以上的程式碼中引入了requests、lxml庫,分別實現訪問網頁、對網頁結構解析。對於這兩個庫我還不太熟悉,以後估計會更多地用到,實在記不住,那就要用的時候查吧。此外,我知道python有很多開源的庫,直接呼叫這些庫,一是避免了重複造輪子,增加工作量,二是大大降低了學習的門檻(當然以後技術更好一點,還是得學習如何造輪子的)。

接下來,我應該會有越來越多的小練習,不僅僅侷限於python爬蟲。我想以後也會遇到各種各樣的小問題,不過有網上各位前輩的經驗和教程,沒什麼可畏懼的。

相關文章