前面一直強調Python運用到網絡爬蟲方面非常有效,這篇文章也是結合學習的Python視頻知識及我研究生數據挖掘方向的知識.從而簡單介紹下Python是如何爬去網絡數據的,文章知識非常簡單,但是也分享給大家,就當簡單入門吧!同時只分享知識,希望大家不要去做破壞網絡的知識或侵犯別人的原創型文章.主要包括:
1.介紹爬取CSDN自己博客文章的簡單思想及過程
2.實現Python源碼爬取新浪韓寒博客的316篇文章
## 一.爬蟲的簡單思想
最近看劉兵的《Web數據挖掘》知道,在研究信息抽取問題時主要采用的是三種方法:
1.手工方法:通過觀察網頁及源碼找出模式,再編寫程序抽取目標數據.但該方法無法處理站點數量巨大情形.
2.包裝器歸納:它英文名稱叫WrapperInduction,即有監督學習方法,是半自動的.該方法從手工標注的網頁或數據記錄集中學習一組抽取規則,從而抽取具有類似格式的網頁數據.
3.自動抽取:它是無監督方法,給定一張或數張網頁,自動從中尋找模式或語法實現數據抽取,由于不需要手工標注,故可以處理大量站點和網頁的數據抽取工作.
這里使用的Python網絡爬蟲就是簡單的數據抽取程序,后面我也將陸續研究一些Python+數據挖掘的知識并寫這類文章.首先我想獲取的是自己的所有CSDN的博客(靜態.html文件),具體的思想及實現方式如下:
第一步 分析csdn博客的源碼
首先需要實現的是通過分析博客源碼獲取一篇csdn的文章,在使用IE瀏覽器按F12或Google Chrome瀏覽器右鍵"審查元素"可以分析博客的基本信息.在網頁中[http://blog.csdn.net/eastmount](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](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會禁止這樣的行為,服務器禁止爬取站點內容到別人的網上去.我們的博客文章經常被其他網站爬取,但并沒有申明原創出處,還請尊重原創.它顯示的錯誤"403 Forbidden".
PS:據說模擬正常上網能實現爬取CSDN內容,讀者可以自己去研究,作者此處不介紹.參考(已驗證):
[**http://www.yihaomen.com/article/python/210.htm**](http://www.yihaomen.com/article/python/210.htm)
[http://www.2cto.com/kf/201405/304829.html](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
~~~
這思想就非常簡單了,其過程簡單如下:
~~~
?????? for(int i=0;i<4;i++)??????????????? //獲取所有頁文章
?????????????? for(int j=0;j<20;j++)????? //獲取一頁文章 注意最后一頁文章篇數
???????????????????????GetContent();?????? //獲取一篇文章?主要是獲取超鏈接
~~~
同時學習過通過正則表達式,在獲取網頁內容圖片過程中格外方便.如我前面使用C#和正則表達式獲取圖片的文章:[http://blog.csdn.net/eastmount/article/details/12235521](http://blog.csdn.net/eastmount/article/details/12235521)
## 二.爬取新浪博客
上面介紹了爬蟲的簡單思想,但是由于一些網站服務器禁止獲取站點內容,但是新浪一些博客還能實現.這里參照"51CTO學院 智普教育的python視頻"獲取新浪韓寒的所有博客.
地址為:[http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html](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**](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](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/](http://blog.csdn.net/eastmount/))
參考資料:
1.51CTO學院 智普教育的python視頻**[**http://edu.51cto.com/course/course_id-581.html**](http://edu.51cto.com/course/course_id-581.html)
2.《Web數據挖掘》劉兵著
- 前言
- [Python學習] 專題一.函數的基礎知識
- [Python學習] 專題二.條件語句和循環語句的基礎知識
- [Python學習] 專題三.字符串的基礎知識
- [Python學習] 簡單網絡爬蟲抓取博客文章及思想介紹
- [Python學習] 專題四.文件基礎知識
- [python學習] 簡單爬取維基百科程序語言消息盒
- [python學習] 簡單爬取圖片網站圖庫中圖片
- [python知識] 爬蟲知識之BeautifulSoup庫安裝及簡單介紹
- [python+nltk] 自然語言處理簡單介紹和NLTK壞境配置及入門知識(一)
- [python學習] 模仿瀏覽器下載CSDN源文并實現PDF格式備份
- [Python學習] 簡單爬取CSDN下載資源信息
- [Python] 專題五.列表基礎知識 二維list排序、獲取下標和處理txt文本實例
- [Python學習] 專題六.局部變量、全局變量global、導入模塊變量
- [python] 專題七.網絡編程之套接字Socket、TCP和UDP通信實例
- [python] 專題八.多線程編程之thread和threading