Python BeautifulSoup爬取oschina我的blog文章

      前段時間學習了一些python的模塊,要熟悉各個功能仍是得寫寫代碼的,因此根據前面掌握的模塊知識,寫了一個小程序,專門用來爬取oschina的我的博客文章的小工具。常常看到一些大牛的好文章,本着學習的目的把大牛的全部文章爬取到本地,自建一個web網站,就能夠在本地訪問了,也算是保存一份吧。 python

      本人剛學python,代碼比較醜陋,有時我都不忍直視,因爲還沒看re正則模塊,因此在處理文章名轉義時還很嫩,爬取的是我的的全部blog文章,因此須要相似這樣的URL:http://my.oschina.net/guol/blog web

     代碼以下: shell

#!/usr/bin/python
#coding=utf-8
import urllib2,re,sys,json,os
from bs4 import BeautifulSoup
from urllib import urlencode

url=sys.argv[1]
blogname=url.split('/')[3]

def ParsePage(url):
    heard={'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
    rurl=urllib2.Request(url,headers=heard)
    page=urllib2.urlopen(rurl)
    return page

def GetParentPage():
    global url
    pd={}
    page=ParsePage(url)
    soup=BeautifulSoup(page)
    li=soup.find('strong')
    licon=str(li.find_next('ul'))
    soup_t=BeautifulSoup(licon)
    for i in soup_t.find_all('li'):
        ul=i.a['href']
        title=i.a.text
        tcon=title.encode('utf-8')
        pd[ul]=tcon
    return pd

def GetClass():
    pd={}
    cla=GetParentPage()
    for k in cla:
        url=k
        title=cla[k]
        page=ParsePage(url)
        soup=BeautifulSoup(page)
        i=soup.find_all('h2','BlogAccess_true BlogTop_0')
        for index,item in enumerate(i):
            ul=i[index].a['href']
            title=i[index].a.text
            pd[ul]=title
    return pd


def DownPages():
    reload(sys)
    cla=GetClass()
    t=int(len(cla))
    p=int(0)
    global blogname
    blogdir='/var/www/'+blogname
    dircmd='mkdir -p'+' '+blogdir
    os.system(dircmd)
    sys.setdefaultencoding("utf-8")
    for k in cla:
        while p < t:
            page=ParsePage(k)
            soup=BeautifulSoup(page)
            biaoti=str(soup.title.text)
            bcon=biaoti.split(' -')[0]
            bt=bcon.replace('/','-').replace(' ','-').replace('(','').replace(')','')
            tcon=str(soup.find('div','BlogContent'))
            csoup=BeautifulSoup(tcon)
            ctext=csoup.prettify()
            filename=blogdir+'/'+bt
            command='touch' + ' '+filename
            os.system(command)
            fp=open(filename,'w')
            fp.write(ctext)
            fp.close()
            p=p+1
            break

if __name__ == '__main__':
    DownPages()

    安裝web服務器,我用的是apache:apt-get install apache2 apache

    開始收集文章,選取如下兩個URL    json

http://my.oschina.net/flashsword/blog
http://my.oschina.net/davehe/blog

    假如python腳本保存爲getpage.py,以下運行 getpage.py http://my.oschina.net/davehe/blog,沒有任何返回即爬取完畢,若是有錯誤通常都是文章名稱中有特殊字符致使的。 小程序

    訪問在本地搭建的web站點 安全



       BUG: 服務器

              1 因爲blog文章名的規範問題,在web站點下是按照文章的標題創建文件的,因此若是blog名稱中有特殊字符會致使爬取失敗,解決辦法用re模塊提早對特殊字符進行轉義。 工具

              2 在blog中都會有一些圖片以輔助文章,爬取到本地的文章訪問不了圖片的URL鏈接,應該是有圖片防盜鏈之類的安全措施吧,解決辦法把文章中的圖片也爬取到本地的一個資源文件夾中,同時修改文章中的圖片url鏈接指向本地的資源文件夾。 學習


       歡迎大牛完善一下文章名特殊字符的處理,本文主要是學習python模塊,沒有其餘目的。

相關文章
相關標籤/搜索