前段时间学习了一些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模块,没有其余目的。