[Python學習] 簡單網絡爬蟲抓取博客文章及思想介紹


        前面一直強調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數據挖掘》劉兵著


免責聲明!

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



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