Python是個功能很強大,也很齊全的語言,這在我當初學的時候是不了解的。想想半年前學習python的初衷,無非是是因為ArcGIS提供了python腳本的編譯環境,當我知道ArcToolbox里那些功能強大的工具,有一部分竟然就是用所謂python寫出來的,自然也就想着去嘗試,簡化那些冗雜的工作,這也是我喜歡編程的一個原因。
不過說實話,python斷斷續續的學到現在,也沒寫出什么腳本工具,但怎么也說不能算沒有一點收獲:起碼學會了一門語言呢。雖然離當初的目標有些偏離,但是學習本身,是沒什么壞處的,因為你總會意外的收獲到其他的東西。
Python是開源的,所以除了官方的庫之外,有很多第三方的庫,可以做很多事情,像科學計算,機器學習,搭建網站的框架,還有,當然了,就是爬蟲,想想就很有意思。目前也是剛接觸,numpy是跟着一本書學,爬蟲的話,就是在網上找資料,參照着別人的案例。
今天寫的第一個,就是參照蟲師老師的一篇博客http://www.cnblogs.com/fnng/p/3576154.html。這個例子,說的是如何從一個網頁中,將所有的圖片下載到本地,並編號,在看代碼之前完全是沒有一點概念的,看完之后就感覺,整個過程並不復雜,python提供了功能相當強大的urllib庫,代碼也很簡單。
| # python讀取網頁的庫 import urllib # 正則表達式有關模塊 import re |
這里說一說正則表達式,正則表達式(Regular Expression)是很復雜的,不只有python有,像Java, C#都有,說白了就是編寫一定的規則來匹配字符串,掌握基礎的就已經夠用,復雜的以后還得慢慢學,這里還是推薦廖雪峰老師的個人網站http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832260566c26442c671fa489ebc6fe85badda25cd000,上手不困難
| def getHTML(url): # 類似於文件的打開 page = urllib.urlopen(url) # 類似於文件的讀取 html = page.read() return html |
考慮到之后的使用的方便,這里將這個方法進行了封裝,寫成一個函數,代碼很簡單,和文件的讀取很類似。
這個其實是整個個爬蟲過程最復雜的一部分。因為網站的內容相差很大,想要提取的信息也是不一樣的,所以沒有一個萬能的正則表達式,得就事論事。
接下來就具體分析一個網頁,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) |
這個函數正則表達式部分已經寫完,但只完成了一半,接下來就是根據提取到的鏈接,來下載文件並保存到本地
| # t負責給文件編號 t = 1 for img in imags: # 使用urltrieve從鏈接中獲取文件 urllib.urlretrieve(img, 'D:\Learn\Code\python\pachong\photo\%s.jpg' % t) t += 1 |
| url = 'http://tieba.baidu.com/p/4571038933?see_lz=1' html = getHTML(url) getImag(html) |
就可以在文件夾中等着接收文件吧

的確是很有成就感。
在這個網站中,我發現了更為有趣的用法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,甚至是分布式
