python新浪博客爬虫(纯自己写)

python新浪博客爬虫(纯自己写)

一直在学习javaweb方面的知识,什么J2SE,ssh框架,tomcat,学的累了。突然想学习一门脚本语言,虽然js也会点,就是不怎么熟练。感觉Python挺有意思的,就花了两天学习了下,还知道可以比较方便的用来编写网络爬虫,觉得很有意思,所以就觉得自己编写一个,花了一晚上时间写了一个从新浪博客上爬韩寒文章的爬虫。自己编写的,洗的不好的地方,请指出,大家一起讨论。
直接贴出代码,每个函数上面都是注释,很容易看懂的。



 __auyhor__='sw'                                                                                                                              
 # -*- coding:utf-8 -*-
 
 import urllib2
 import urllib
 import tools
 import re
 import os
 import sys
 reload(sys)
 sys.setdefaultencoding('utf8')
 
 class Weibo:
     
     def __init__(self):
         self.tool = tools.Tool()
 
     #得到文章列表第一面的内容
     def getArticlePage(self,url):
         request = urllib2.Request(url)
         response = urllib2.urlopen(request)
         return response.read().decode('utf-8').encode('gbk').decode('gbk')
 
     #得到列表第一面中所有链接信息
     def getLink(self,url):
         page = self.getArticlePage(url);
         pattern = re.compile('<span.*?class="atc_title">.*?<a.*?href="(.*?)".*?>(.*?)</a>',re.S)
         items = re.findall(pattern,page)
         contents = []
         for item in items:
             contents.append([item[0],item[1]])
         return contents
     
     #通过URL得到文章内容
     def getArticleDetail(self,ArticleUrl):
         request = urllib2.Request(ArticleUrl)
         response = urllib2.urlopen(request)
         content = response.read()
         return content
 
     #通过内容筛选出文章并且保存起来
     def saveArticle(self,content,name,path):
         pattern = re.compile('<div id="sina_keyword_ad_area2" class="articalContent   ">(.*?)</div>',re.S)
         result = re.search(pattern,content).group(1)
         result = self.tool.replace(result)
         fileName = path + "/" + name + ".txt"
         f = open(fileName,"w+")
         print u"正在下载文章",name
         f.write(result.encode('utf-8'))
         f.close()
 
     #从第一页中得到所有的列表页面链接
     def getPageLink(self,url):
         page = self.getArticlePage(url)
         pattern = re.compile('<li>.*?<a.*?href="(.*?)".*?>.*?</li>',re.S)
         result = re.findall(pattern,page)
         return result
 
     #创建新目录
     def mkdir(self,path):
         path = path.strip()
         isExits = os.path.exists(path)
         if not isExits:
             print u"创建了新的文件夹叫做",path
             os.makedirs(path)
             return True
         else:
             print u"名为",path,"的文件夹已经创建成功"
             return False
     
     #通过url下载文章
     def downloadByURL(self,url,i):
         contents = self.getLink(url)
         path = "第"+str(i)+"页"
         self.mkdir(path)
         for item in contents:
             content = self.getArticleDetail(item[0])
             self.saveArticle(content,item[1],path)
 
                                                                                                                                              
     def main(self):
         url = 'http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html'
         i = 1
         self.downloadByURL(url,i)
 
         pageUrl = self.getPageLink(url)
         for URL in pageUrl:
             i = i + 1
             self.downloadByURL(URL,i)
 
 print """
 ----------------------------------------------------------------------
 时间:2015.5.21 星期四
 作者:sw
 版本:0.1
 python版本:2.7.3
 功能:新浪博客爬虫,抓取韩寒博客里面所有的文章存到本地为.txt文档,用文章    的标题作为文档的名称,每一页存为一个文件夹
 操作:直接运行即可
 -----------------------------------------------------------------------
 """
 weibo = Weibo()
 weibo.main()    

还有一个工具类,主要是除去文章中多余的链接,换行之类的
 __author__='sw'                                                                                                                              
 # -*- coding:utf-8 -*-
 import re
 
 class Tool:
     removeImg = re.compile('<img.*?>| {1,7}| ')
     removeAddr = re.compile('<a.*?>|</a>')
     replaceLine = re.compile('<tr>|<div>|</div>|</p>')
     replaceBR = re.compile('<br><br>|<br>')
     removeExtraTag = re.compile('<.*?>')
     removeNoneLine = re.compile('\n+')
 
     def replace(self,x):
         x = re.sub(self.removeImg,"",x)
         x = re.sub(self.removeAddr,"",x)
         x = re.sub(self.replaceLine,"\n",x)
         x = re.sub(self.replaceBR,"\n",x)
         x = re.sub(self.removeExtraTag,"",x)
         x = re.sub(self.removeNoneLine,"\n",x)
         return x.strip()     

事实上有的地方还是可以改进的,现在只是爬取韩寒博客的文章,下一个版本可以输入一个博客的网址,从输入的网址中爬取文章,有时间再改进改进吧。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值