Python爬蟲之urllib模塊1css
本文來自網友投稿。做者PG,一個待畢業待就業二流大學生。玄魂工做室未對該文章內容作任何改變。html
由於本人一直對推理懸疑比較感興趣,因此此次爬取的網站也是平時看一些懸疑故事的網站,同時也是由於這個網站在編碼上面和一些大網站的博客不一樣,並不那麼規範,因此對於初學者仍是有必定的挑戰性的。我打算把這個爬蟲分三次講,因此每次都先完成一個小目標(固然不是一個億啦),此次課咱們先爬取當前頁面的而且下載第一篇文章。第二次課咱們就將爬取當前頁面的=全部的連接進行下載,第三次課咱們將把整個板塊的文章都下載下來。python
演示系統用的是kali,由於懶得去配置各類py模塊了,就利用系統已經配置好的,瀏覽器是firefox,使用的IDE是微軟的vscodelinux
首先咱們選取了咱們要爬取的網站http://tuilixue.com/,先檢查一下robots.txt看看是否存在有一些反爬蟲的信息正則表達式
很好,這裏沒有什麼限制windows
而後咱們到我平時比較常去的板塊看看,http://tuilixue.com/zhentantuilizhishi/list_4_1.html咱們如今想要爬取的文章就是這樣的瀏覽器
右擊鼠標查看源代碼,咱們能夠看到,咱們想要爬取的連接就是這樣的微信
來一張清晰的ide
可是咱們要怎麼辦才能使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篇文章是咱們須要爬取的,咱們先從第一篇的連接開始。
這時候咱們就要想咱們應該怎麼樣去獲取到這個頁面的連接了,若是正則表達式好的同窗應該是想到了採起正則表達式進行獲取,可是這裏有一個問題,一個html頁面中有如此多的a開頭的元素,也有如此多的href開頭的元素,想要經過正則去定位仍是有點難的,就算定位出來,也是一大堆的代碼,這就不利於可讀性了。這時咱們應該再從html文本中去分析。咱們使用type函數進行類型的判斷。
經過對pageContent的類型分析,咱們知道這是一個字符串類型
這樣咱們就可使用字符串中的find函數了,咱們須要對find函數有一個瞭解
函數中說明了從字符串中尋找目標字符,返回找到的第一個下標,若是沒有找到就返回-1,同時能夠設置開始尋找的位置和結束的位置。
咱們再看到文本
咱們發現是在div class=「liszw」下的li元素中的a元素中含有咱們須要的連接,這時咱們一個個來分析。
Li不能做爲咱們的選擇了
a也不行
這個數量就比較接近了,我再看看先後文的規律發現/span><a彷佛是符合咱們的要求的
這時咱們發現這和咱們所要爬取的連接數量上是徹底吻合的。咱們就來試試。
這裏咱們採起了一個切片操做,這時咱們發現連接其實已經爬取到了,可是仍是有些不完美,咱們再來完善一下他。
咱們來對比一下咱們的網頁上的第一個連接
這樣咱們就成功的爬取了第一個連接,如今咱們來準備下載第一篇文章。從前面咱們能夠知道,咱們能夠把網頁經過python的urllib模塊下載下來,那麼一樣的道理,我同樣也能夠經過urllib模塊對文章進行下載。咱們經過連接的最後一串數字對下載下來的文件進行命名。並在下載玩後打印end進行提示。
咱們能夠看到,路徑下是沒有文件的。如今咱們開始下載。
從這裏看咱們的文件應該是下載成功了,咱們去文件路徑下面看看。
文件下載是成功了,咱們來打開看看。這個地方要注意地址欄的連接
這樣,咱們第一篇的文章就下載成功了。
未完,待續。請持續關注 微信訂閱號:玄魂工做室(xuanhun521)