Python爬蟲學習筆記(一)


Python是個功能很強大,也很齊全的語言,這在我當初學的時候是不了解的。想想半年前學習python的初衷,無非是是因為ArcGIS提供了python腳本的編譯環境,當我知道ArcToolbox里那些功能強大的工具,有一部分竟然就是用所謂python寫出來的,自然也就想着去嘗試,簡化那些冗雜的工作,這也是我喜歡編程的一個原因。

不過說實話,python斷斷續續的學到現在,也沒寫出什么腳本工具,但怎么也說不能算沒有一點收獲:起碼學會了一門語言呢。雖然離當初的目標有些偏離,但是學習本身,是沒什么壞處的,因為你總會意外的收獲到其他的東西。

Python是開源的,所以除了官方的庫之外,有很多第三方的庫,可以做很多事情,像科學計算,機器學習,搭建網站的框架,還有,當然了,就是爬蟲,想想就很有意思。目前也是剛接觸,numpy是跟着一本書學,爬蟲的話,就是在網上找資料,參照着別人的案例。

今天寫的第一個,就是參照蟲師老師的一篇博客http://www.cnblogs.com/fnng/p/3576154.html。這個例子,說的是如何從一個網頁中,將所有的圖片下載到本地,並編號,在看代碼之前完全是沒有一點概念的,看完之后就感覺,整個過程並不復雜,python提供了功能相當強大的urllib庫,代碼也很簡單。

1、導入相關庫

# python讀取網頁的庫

import urllib

# 正則表達式有關模塊

import re

 

這里說一說正則表達式,正則表達式(Regular Expression)是很復雜的,不只有python有,像Java, C#都有,說白了就是編寫一定的規則來匹配字符串,掌握基礎的就已經夠用,復雜的以后還得慢慢學,這里還是推薦廖雪峰老師的個人網站http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832260566c26442c671fa489ebc6fe85badda25cd000,上手不困難

2、獲取網頁的html

def getHTML(url):

# 類似於文件的打開

page = urllib.urlopen(url)

# 類似於文件的讀取

html = page.read()

return html

 

考慮到之后的使用的方便,這里將這個方法進行了封裝,寫成一個函數,代碼很簡單,和文件的讀取很類似。

3、編寫正則表達式

這個其實是整個個爬蟲過程最復雜的一部分。因為網站的內容相差很大,想要提取的信息也是不一樣的,所以沒有一個萬能的正則表達式,得就事論事。

接下來就具體分析一個網頁,html+css+Javascript接下來還得繼續學習。

比如說這個網站http://tieba.baidu.com/p/4571038933?see_lz=1里面有很多圖片,在Chrome里按住F12查看源代碼,會發現,這里面所有的圖片都鏈接到一個網址,並且格式如下:

我們所需要的,就是提取src=""里面的鏈接。

代碼如下:

def getImag(html):

# 這里是通過compile將字符串編譯成一個正則對象

# re.S表示多行匹配,比較常用

pattern = re.compile('<img class="BDE_Image".*?"(.*?)"', re.S)

# re.findall以列表形式返回匹配到的子串,也常見match(從頭匹配),search(任意匹配)

imags = re.findall(pattern, html)

 

這個函數正則表達式部分已經寫完,但只完成了一半,接下來就是根據提取到的鏈接,來下載文件並保存到本地

4、獲取圖片

# t負責給文件編號

t = 1

for img in imags:

# 使用urltrieve從鏈接中獲取文件

urllib.urlretrieve(img, 'D:\Learn\Code\python\pachong\photo\%s.jpg' % t)

t += 1

 

5、試運行

url = 'http://tieba.baidu.com/p/4571038933?see_lz=1'

html = getHTML(url)

getImag(html)

就可以在文件夾中等着接收文件吧

的確是很有成就感。

6、下面就來完善代碼吧

在這個網站中,我發現了更為有趣的用法http://www.nowamagic.net/academy/detail/1302861

參閱幫助文檔,可以發現urlretrieve有個回調函數

具體可以這樣來用,寫一個回調函數Reporthook()

def Reporthook(a, b, c):

# a:已經下載的數據塊,b:數據塊的大小,遠程文件的大小

per = 100 * a * b / c

if per > 100:

per = 100

print '%.2f%%' % per

 

然后在urlretrieve()的里面增加一個名為Reporthook的參數即可

相當有意思!!!!!

總結:

1、關於爬蟲,沒有找到有關的書籍。但是,但是,網絡上的資源其實是相當豐富的,尤其是很多技術博客,作者寫的都相當的詳細,參照着學,收獲是很大的,以上我寫的都是在網上找到的。見賢思齊焉,遇到不會的,就去學習好了。

2、python官方文檔,講的雖然不詳細,但簡明扼要,都是核心的東西,多看看,會發現很多的盲點,就像這個例子里的回調函數,很多人估計在學爬蟲的時候都沒有使用過。

3、爬蟲會接觸到很多網頁前端的內容,接下里要想爬的更好,就得學html+css+javascript,甚至是分布式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM