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