您的位置:首页 > 编程语言 > Python开发

python——博客园首页信息提取与分析(转载有改动)

2013-08-21 20:47 369 查看
昨天看到了这篇文章,挺感兴趣的,早就知道python功能很强大,抓取网站信息很方便,一直没有用过,就好好分析了一下,在原作者的基础上修改了一下,也实现了博客园首页信息的提取,主要提取的是关于文章的标题、作者、发布时间、评论、阅读几个属性。

获取不同页面的html数据:

import os,urllib,sys
class LinkParser:
def __init__(self,url):
self.urls=

解释:定义了LinkParser类,类的初始化需要一个网站,上面给出的就是博客园的网址,通过查看博客园的前台源代码发现,博客园不同的页面就是在'http://www.cnblogs.com/'基础上加p2、p3、p4等等,加p12就是第12页,所以可以循环把你想得到的页面的网址保存到一个数组里面,getDatas()方法就是遍历该数组,把各个网址的前台html数据得到,并保存到相应的文件中,注意要在当前.py文件所在的路径下新建data文件夹。

处理获取的html数据,并且得到自己想要的数据:

# -*- coding: utf-8 -*-
from HTMLParser import HTMLParser
import os,sys
class MyHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.flag=0
self.title=''
self.author=''
self.time=''
self.comment=''
self.view=''
self.result=[('题目','作者','发布时间','评论次数','阅读次数')]
def handle_starttag(self,tag,attrs):
if self.flag==0:
if tag=='a':
for i in attrs:
if i[0]=='class' and i[1]=='titlelnk':
self.flag=1
elif self.flag==2:
if tag=='div':
for i in attrs:
if i[0]=='class' and i[1]=='post_item_foot':
self.flag=3
elif self.flag==3:
if tag=='a':
self.flag=4
elif self.flag==5:
if tag=='span':
for i in attrs:
if i[0]=='class' and i[1]=='article_comment':
self.flag=6
elif self.flag==7:
if tag=='span':
for i in attrs:
if i[0]=='class' and i[1]=='article_view':
self.flag=8
def handle_data(self,data):
if self.flag==1:
self.title=data.strip()
self.flag=2
elif self.flag==4:
self.author=data.strip()
self.flag=5
elif self.flag==5:
self.time=data.strip()[-16:]
elif self.flag==6:
self.comment=data.strip()[7:-1]
self.flag=7
elif self.flag==8:
self.view=data.strip()[7:-1]
self.result.append((self.title,self.author,self.time,self.comment,self.view))
self.flag=0
def getContent(filename):
parser=MyHTMLParser()
f=open(os.path.join(os.getcwd(),'data',filename),'r+')
s=f.read()
f.close()
parser.feed(s)
f=open(os.path.join(os.getcwd(),'result.txt'),'a')
for i in parser.result:
f.write('{0}\t{1}\t{2}\t{3}\t{4}\n'.format(i[0],i[1],i[2],i[3],i[4]))
f.close()
if __name__=="__main__":
for i in os.listdir(os.path.join(os.getcwd(),'data')):
print i
getContent(i)
input()


前面一步得到了不同页面下的html数据,这一步就是解析数据得到我们想要的信息,用到了HTMLParser类的几个方法,比如handle_starttag(self,tag,attrs)方法,该方法是在遇到html语言中的开始标志时才调用的方法,tag是标签名称,attrs是标签的属性,handle_data(self,data)是遇到html语言中的数据项时调用的方法。

需要注意:该类中的方法只有遇到是属于该方法的属性时才调用,比如下面这是博客园的前台源码,我们怎么得到想要的数据呢?

<div class="post_item_foot">
<a href="http://www.cnblogs.com/wumadi/" class="lightblue">无码帝</a>
发布于 2013-08-22 09:02
<span class="article_comment"><a href="http://www.cnblogs.com/wumadi/p/3270528.html#commentform" title="" class="gray">
评论(0)</a></span><span class="article_view"><a href="http://www.cnblogs.com/wumadi/p/3270528.html" class="gray">阅读(27)</a></span></div>
</div>


分析这段html源码,解析该数据过程:遇到开始标签'div',调用handle_starttag()方法,遇到开始标签'a',调用handle_starttag()方法,遇到内容'无码弟',调用handle_data()方法,继续又遇到内容'发表于 2013-09-22 09:02',又是调用handle_data()方法,接着遇到开始标签'span',调用.....过程就是这样。

最终结果图:



说明:该文章是在转载的作者'ola2010'的文章基础上修改得到的。[url=http://www.cnblogs.com/ola2010/p/3270998.html#2756759]点击原文链接" target=_blank>
for i in range(2,10):
self.urls.insert(0,url+'p'+str(i))

def getDatas(self):
cnt=0
while len(self.urls)>=1:
x=self.urls.pop()
cnt=cnt+1
print ('start parser:',x)
try:
f=urllib.urlopen(x)
s=f.read()
f.close()
fx=open(os.path.join(os.getcwd(),'data','{0}.html'.format('No.'+str(cnt))),'wb')
fx.write(s)
fx.close()
except:
print('error',x)
print(sys.exc_info())
continue
if __name__=="__main__":
parser=LinkParser('http://www.cnblogs.com/')
parser.getDatas()[/code]

解释:定义了LinkParser类,类的初始化需要一个网站,上面给出的就是博客园的网址,通过查看博客园的前台源代码发现,博客园不同的页面就是在'http://www.cnblogs.com/'基础上加p2、p3、p4等等,加p12就是第12页,所以可以循环把你想得到的页面的网址保存到一个数组里面,getDatas()方法就是遍历该数组,把各个网址的前台html数据得到,并保存到相应的文件中,注意要在当前.py文件所在的路径下新建data文件夹。

处理获取的html数据,并且得到自己想要的数据:

# -*- coding: utf-8 -*-
from HTMLParser import HTMLParser
import os,sys
class MyHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.flag=0
self.title=''
self.author=''
self.time=''
self.comment=''
self.view=''
self.result=[('题目','作者','发布时间','评论次数','阅读次数')]
def handle_starttag(self,tag,attrs):
if self.flag==0:
if tag=='a':
for i in attrs:
if i[0]=='class' and i[1]=='titlelnk':
self.flag=1
elif self.flag==2:
if tag=='div':
for i in attrs:
if i[0]=='class' and i[1]=='post_item_foot':
self.flag=3
elif self.flag==3:
if tag=='a':
self.flag=4
elif self.flag==5:
if tag=='span':
for i in attrs:
if i[0]=='class' and i[1]=='article_comment':
self.flag=6
elif self.flag==7:
if tag=='span':
for i in attrs:
if i[0]=='class' and i[1]=='article_view':
self.flag=8
def handle_data(self,data):
if self.flag==1:
self.title=data.strip()
self.flag=2
elif self.flag==4:
self.author=data.strip()
self.flag=5
elif self.flag==5:
self.time=data.strip()[-16:]
elif self.flag==6:
self.comment=data.strip()[7:-1]
self.flag=7
elif self.flag==8:
self.view=data.strip()[7:-1]
self.result.append((self.title,self.author,self.time,self.comment,self.view))
self.flag=0
def getContent(filename):
parser=MyHTMLParser()
f=open(os.path.join(os.getcwd(),'data',filename),'r+')
s=f.read()
f.close()
parser.feed(s)
f=open(os.path.join(os.getcwd(),'result.txt'),'a')
for i in parser.result:
f.write('{0}\t{1}\t{2}\t{3}\t{4}\n'.format(i[0],i[1],i[2],i[3],i[4]))
f.close()
if __name__=="__main__":
for i in os.listdir(os.path.join(os.getcwd(),'data')):
print i
getContent(i)
input()


前面一步得到了不同页面下的html数据,这一步就是解析数据得到我们想要的信息,用到了HTMLParser类的几个方法,比如handle_starttag(self,tag,attrs)方法,该方法是在遇到html语言中的开始标志时才调用的方法,tag是标签名称,attrs是标签的属性,handle_data(self,data)是遇到html语言中的数据项时调用的方法。

需要注意:该类中的方法只有遇到是属于该方法的属性时才调用,比如下面这是博客园的前台源码,我们怎么得到想要的数据呢?

<div class="post_item_foot">
<a href="http://www.cnblogs.com/wumadi/" class="lightblue">无码帝</a>
发布于 2013-08-22 09:02
<span class="article_comment"><a href="http://www.cnblogs.com/wumadi/p/3270528.html#commentform" title="" class="gray">
评论(0)</a></span><span class="article_view"><a href="http://www.cnblogs.com/wumadi/p/3270528.html" class="gray">阅读(27)</a></span></div>
</div>


分析这段html源码,解析该数据过程:遇到开始标签'div',调用handle_starttag()方法,遇到开始标签'a',调用handle_starttag()方法,遇到内容'无码弟',调用handle_data()方法,继续又遇到内容'发表于 2013-09-22 09:02',又是调用handle_data()方法,接着遇到开始标签'span',调用.....过程就是这样。

最终结果图:



说明:该文章是在转载的作者'ola2010'的文章基础上修改得到的。[url=http://www.cnblogs.com/ola2010/p/3270998.html#2756759]点击原文链接
。感谢该作者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: