Python是個功能很強大,也很齊全的語言,這在我當初學的時候是不瞭解的。想一想半年前學習python的初衷,無非是是由於ArcGIS提供了python腳本的編譯環境,當我知道ArcToolbox裏那些功能強大的工具,有一部分居然就是用所謂python寫出來的,天然也就想着去嘗試,簡化那些冗雜的工做,這也是我喜歡編程的一個緣由。 javascript
不過說實話,python斷斷續續的學到如今,也沒寫出什麼腳本工具,但怎麼也說不能算沒有一點收穫:起碼學會了一門語言呢。雖然離當初的目標有些偏離,可是學習自己,是沒什麼壞處的,由於你總會意外的收穫到其餘的東西。 css
Python是開源的,因此除了官方的庫以外,有不少第三方的庫,能夠作不少事情,像科學計算,機器學習,搭建網站的框架,還有,固然了,就是爬蟲,想一想就頗有意思。目前也是剛接觸,numpy是跟着一本書學,爬蟲的話,就是在網上找資料,參照着別人的案例。 html
今天寫的第一個,就是參照蟲師老師的一篇博客http://www.cnblogs.com/fnng/p/3576154.html。這個例子,說的是如何從一個網頁中,將全部的圖片下載到本地,並編號,在看代碼以前徹底是沒有一點概念的,看完以後就感受,整個過程並不複雜,python提供了功能至關強大的urllib庫,代碼也很簡單。 前端
# python讀取網頁的庫 java import urllib python # 正則表達式有關模塊 正則表達式 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的參數便可
至關有意思!!!!!
總結:
一、關於爬蟲,沒有找到有關的書籍。可是,可是,網絡上的資源實際上是至關豐富的,尤爲是不少技術博客,做者寫的都至關的詳細,參照着學,收穫是很大的,以上我寫的都是在網上找到的。見賢思齊焉,遇到不會的,就去學習好了。
二、python官方文檔,講的雖然不詳細,但簡明扼要,都是核心的東西,多看看,會發現不少的盲點,就像這個例子裏的回調函數,不少人估計在學爬蟲的時候都沒有使用過。
三、爬蟲會接觸到不少網頁前端的內容,接下里要想爬的更好,就得學html+css+javascript,甚至是分佈式