標籤:font-face ogr 部分 tom file gb2312 編碼轉換 img alt
Python爬蟲之urllib模組1
本文來自網友投稿。作者PG,一個待畢業待就業二流大學生。玄魂工作室未對該文章內容做任何改變。
因為本人一直對推理懸疑比較感興趣,所以這次爬取的網站也是平時看一些懸疑故事的網站,同時也是因為這個網站在編碼上面和一些大網站的部落格不同,並不那麼規範,所以對於初學者還是有一定的挑戰性的。我打算把這個爬蟲分三次講,所以每次都先完成一個小目標(當然不是一個億啦),這次課我們先爬取當前頁面的並且下載第一篇文章。第二次課我們就將爬取當前頁面的=所有的連結進行下載,第三次課我們將把整個板塊的文章都下載下來。
示範系統用的是kali,因為懶得去配置各種py模組了,就利用系統已經配置好的,瀏覽器是firefox,使用的IDE是微軟的vscode
首先我們選取了我們要爬取的網站http://tuilixue.com/,先檢查一下robots.txt看看是否存在有一些反爬蟲的資訊
很好,這裡沒有什麼限制
然後我們到我平時比較常去的板塊看看,http://tuilixue.com/zhentantuilizhishi/list_4_1.html我們現在想要爬取的文章就是這樣的
右擊滑鼠查看原始碼,我們可以看到,我們想要爬取的連結就是這樣的
來一張清晰的
但是我們要怎麼辦才能使python得到這個網頁的原始碼呢
我們可以使用python的urllib模組提供的open方法,首先我們先建立一個py檔案,慣例
#-*-coding:utf8-*-
#!usr/bin/python
因為是linux系統,所以python路徑不同於windows,第一行代碼說明是用的uft-8進行編碼
在這裡我們要先匯入urllib這個模組,使用import匯入
這裡其實是兩個方法,一個open一個read,open用於從網站上擷取網頁代碼,read是為了讀出來好列印
我們可以得到上面結果,但是我們發現字元似乎成了亂碼,為了找到原因,我們再來看看源碼
我們似乎找到了原因,網頁使用的是gb2312進行編碼的,但是我們是使用utf-8的,所以導致的亂碼,對這方面不解的同學可以去找一些編碼的知識看看。下面我們用一個編碼轉換來嘗試擷取正確的編碼
大家這時可以看到,我們通過強制的編碼將擷取的網頁重新通過gb2312進行編碼,我們就可以看到正確的字元了,但是在我們的這次課中並不需要這樣的轉碼,這裡只是為了顯示擷取的是正確的網頁,看到,我們擷取的正是我們需要進行爬取的頁面。
下一步,我們需要擷取我們本頁的所有的文章連結了,這裡需要有一點html和css的知識,關於這部分的知識,大家自己去掌握就行了,不需要太深入。中顯示的,href後面的就是我們在本次課中需要爬取的連結,每頁都有10篇文章是我們需要爬取的,我們先從第一篇的連結開始。
這時候我們就要想我們應該怎麼樣去擷取到這個頁面的連結了,如果Regex好的同學應該是想到了採取Regex進行擷取,但是這裡有一個問題,一個html頁面中有如此多的a開頭的元素,也有如此多的href開頭的元素,想要通過正則去定位還是有點難的,就算定位出來,也是一大堆的代碼,這就不利於可讀性了。這時我們應該再從html文本中去分析。我們使用type函數進行類型的判斷。
通過對pageContent的類型分析,我們知道這是一個字串類型
這樣我們就可以使用字串中的find函數了,我們需要對find函數有一個瞭解
函數中說明了從字串中尋找目標字元,返回找到的第一個下標,如果沒有找到就返回-1,同時可以設定開始尋找的位置和結束的位置。
我們再看到文本
我們發現是在div class=“liszw”下的li元素中的a元素中含有我們需要的連結,這時我們一個個來分析。
Li不能作為我們的選擇了
a也不行
這個數量就比較接近了,我再看看前後文的規律發現/span><a似乎是符合我們的要求的
這時我們發現這和我們所要爬取的連結數量上是完全吻合的。我們就來試試。
這裡我們採取了一個切片操作,這時我們發現連結其實已經爬取到了,但是還是有些不完美,我們再來完善一下他。
我們來對比一下我們的網頁上的第一個連結
這樣我們就成功的爬取了第一個連結,現在我們來準備下載第一篇文章。從前面我們可以知道,我們可以把網頁通過python的urllib模組下載下來,那麼同樣的道理,我一樣也可以通過urllib模組對文章進行下載。我們通過連結的最後一串數字對下載下來的檔案進行命名。並在下載玩後列印end進行提示。
我們可以看到,路徑下是沒有檔案的。現在我們開始下載。
從這裡看我們的檔案應該是下載成功了,我們去檔案路徑下面看看。
檔案下載是成功了,我們來開啟看看。這個地方要注意地址欄的連結
這樣,我們第一篇的文章就下載成功了。
未完,待續。請持續關注 訂閱號:玄魂工作室(xuanhun521)
Python爬蟲之urllib模組1