前段時間學習了一些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模塊,沒有其餘目的。