前面一直強調Python運用到網絡爬蟲方面很有效,這篇文章也是結合學習的Python視頻知識及我研究生數據挖掘方向的知識.從而簡介下Python是怎樣爬去網絡數據的,文章知識很easy,可是也分享給大家,就當簡單入門吧!同一時候僅僅分享知識,希望大家不要去做破壞網絡的知識或侵犯別人的原創型文章.主要包含:
1.介紹爬取CSDN自己博客文章的簡單思想及過程
2.實現Python源代碼爬取新浪韓寒博客的316篇文章
一.爬蟲的簡單思想
近期看劉兵的《Web數據挖掘》知道,在研究信息抽取問題時主要採用的是三種方法:
1.手工方法:通過觀察網頁及源代碼找出模式,再編敲代碼抽取目標數據.但該方法無法處理網站數量巨大情形.
2.包裝器歸納:它英文名稱叫Wrapper Induction,即有監督學習方法,是半自己主動的.該方法從手工標注的網頁或數據記錄集中學習一組抽取規則,從而抽取具有類似格式的網頁數據.
3.自己主動抽取:它是無監督方法,給定一張或數張網頁,自己主動從中尋找模式或語法實現數據抽取,因為不須要手工標注,故能夠處理大量網站和網頁的數據抽取工作.
這里使用的Python網絡爬蟲就是簡單的數據抽取程序,后面我也將陸續研究一些Python+數據挖掘的知識並寫這類文章.首先我想獲取的是自己的全部CSDN的博客(靜態.html文件),詳細的思想及實現方式例如以下:
第一步 分析csdn博客的源代碼
首先須要實現的是通過分析博客源代碼獲取一篇csdn的文章,在使用IE瀏覽器按F12或Google Chrome瀏覽器右鍵"審查元素"能夠分析博客的基本信息.在網頁中http://blog.csdn.net/eastmount鏈接了作者全部的博文.
顯示的源代碼格式例如以下:
當中<diw class="list_item article_item">..</div>表示顯示的每一篇博客文章,當中第一篇顯演示樣例如以下:
它的詳細html源碼例如以下:
所以我們僅僅須要獲取每頁中博客<div class="article_title">中的鏈接<a href="/eastmount/article/details/39599061">,並添加http://blog.csdn.net就可以.在通過代碼:
import urllib content = urllib.urlopen("http://blog.csdn.net/eastmount/article/details/39599061").read() open('test.html','w+').write(content)
可是CSDN會禁止這種行為,server禁止爬取站點內容到別人的網上去.我們的博客文章常常被其它站點爬取,但並沒有申明原創出處,還請尊重原創.它顯示的錯誤"403 Forbidden".
PS:據說模擬正常上網能實現爬取CSDN內容,讀者能夠自己去研究,作者此處不介紹.參考(已驗證):
http://www.yihaomen.com/article/python/210.htm
http://www.2cto.com/kf/201405/304829.html
第二步 獲取自己全部的文章
這里僅僅討論思想,如果我們第一篇文章已經獲取成功.以下使用Python的find()從上一個獲取成功的位置繼續查找下一篇文章鏈接,就可以實現獲取第一頁的全部文章.它一頁顯示的是20篇文章,最后一頁顯示剩下的文章.
那么怎樣獲取其它頁的文章呢?
我們能夠發現當跳轉到不同頁時顯示的超鏈接為:
第1頁 http://blog.csdn.net/Eastmount/article/list/1 第2頁 http://blog.csdn.net/Eastmount/article/list/2 第3頁 http://blog.csdn.net/Eastmount/article/list/3 第4頁 http://blog.csdn.net/Eastmount/article/list/4
這思想就很easy了,其過程簡單例如以下:
for(int i=0;i<4;i++) //獲取全部頁文章
for(int j=0;j<20;j++) //獲取一頁文章 注意最后一頁文章篇數
GetContent(); //獲取一篇文章 主要是獲取超鏈接
同一時候學習過通過正則表達式,在獲取網頁內容圖片過程中格外方便.如我前面使用C#和正則表達式獲取圖片的文章:http://blog.csdn.net/eastmount/article/details/12235521
二.爬取新浪博客
上面介紹了爬蟲的簡單思想,可是因為一些站點server禁止獲取站點內容,可是新浪一些博客還能實現.這里參照"51CTO學院 智普教育的python視頻"獲取新浪韓寒的全部博客.
地址為:http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html
採用同上面一樣的方式我們能夠獲取每一個<div class="articleCell SG_j_linedot1">..</div>中包括着一篇文章的超鏈接,例如以下圖所看到的:
此時通過Python獲取一篇文章的代碼例如以下:
import urllib content = urllib.urlopen("http://blog.sina.com.cn/s/blog_4701280b0102eo83.html").read() open('blog.html','w+').write(content)
能夠顯示獲取的文章,如今須要獲取一篇文章的超鏈接,即:
<a title="《論電影的七個元素》——關於我對電影的一些看法以及《后會無期》的一些消息" target="_blank" href="http://blog.sina.com.cn/s/blog_4701280b0102eo83.html">《論電影的七個元素》——關於我對電…</a>
在沒有講述正則表達式之前使用Python人工獲取超鏈接http,從文章開頭查找第一個"<a title",然后接着找到"href="和".html"就可以獲取"http://blog.sina.com.cn/s/blog_4701280b0102eo83.html".代碼例如以下:
#<a title=".." target="_blank" href="http://blog.sina...html">..</a> #coding:utf-8 con = urllib.urlopen("http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html").read() title = con.find(r'<a title=') href = con.find(r'href=',title) #從title位置開始搜索 html = con.find(r'.html',href) #從href位置開始搜素近期html url = con[href+6:html+5] #href="共6位 .html共5位 print 'url:',url #輸出 url: http://blog.sina.com.cn/s/blog_4701280b0102eohi.html
以下依照前面講述的思想通過兩層循環就可以實現獲取全部文章,詳細代碼例如以下:
#coding:utf-8 import urllib import time page=1 while page<=7: url=['']*50 #新浪播客每頁顯示50篇 temp='http://blog.sina.com.cn/s/articlelist_1191258123_0_'+str(page)+'.html' con =urllib.urlopen(temp).read() #初始化 i=0 title=con.find(r'<a title=') href=con.find(r'href=',title) html = con.find(r'.html',href) #循環顯示文章 while title!=-1 and href!=-1 and html!=-1 and i<50: url[i]=con[href+6:html+5] print url[i] #顯示文章URL #以下的從第一篇結束位置開始查找 title=con.find(r'<a title=',html) href=con.find(r'href=',title) html = con.find(r'.html',href) i=i+1 else: print 'end page=',page #下載獲取文章 j=0 while(j<i): #前面6頁為50篇 最后一頁為i篇 content=urllib.urlopen(url[j]).read() open(r'hanhan/'+url[j][-26:],'w+').write(content) #寫方式打開 +表示沒有即創建 j=j+1 time.sleep(1) else: print 'download' page=page+1 else: print 'all find end'
這樣我們就把韓寒的316篇新浪博客文章所有爬取成功並能顯示每一篇文章,顯演示樣例如以下:
這篇文章主要是簡單的介紹了怎樣使用Python實現爬取網絡數據,后面我還將學習一些智能的數據挖掘知識和Python的運用,實現更高效的爬取及獲取客戶意圖和興趣方面的知識.想實現智能的爬取圖片和小說兩個軟件.
該文章僅提供思想,希望大家尊重別人的原創成果,不要任意爬取別人的文章並沒有含原創作者信息的轉載!最后希望文章對大家有所幫助,初學Python,假設有錯誤或不足之處,請海涵!
(By:Eastmount 2014-10-4 中午11點 原創CSDN http://blog.csdn.net/eastmount/)
參考資料:
1.51CTO學院 智普教育的python視頻http://edu.51cto.com/course/course_id-581.html
2.《Web數據挖掘》劉兵著