设为首页 收藏本站
查看: 1984|回复: 0

[经验分享] python——博客园首页信息提取与分析

[复制链接]

尚未签到

发表于 2015-4-20 13:07:20 | 显示全部楼层 |阅读模式
前言
  前两天写了博客,然后发到了博客园首页,然后看着点击量一点点上升,感觉怪怪的。
  然后就产生了一点好奇:有多少人把博客发表到了首页上?每天博客园首页会发表多少文章?谁发表的文章最多?评论和阅读数量的对应关系是多少?
  有了好奇之后,就在想,怎样才能知道答案?

1. 寻路第一步
  通过浏览博客园发现,在博客园最多能看到200页。所以,能不能先把这200页给下载下来。之前有写过一篇博客,批量下载图片,所以可以用博客中类似的方法把这些网页下载下来。



from html.parser import HTMLParser
import os,urllib.request,sys
#通过博客园NEXT按钮,可以获取下一个网页的地址,这样一直循环,就可以将200个网页下载下来。
#setp 1. 通过解析网页,获取下一个网页的地址。
class LinkParser(HTMLParser):
def __init__(self,strict=False,domain=''):
HTMLParser.__init__(self,strict)
self.value=''
self.domain=domain
self.next=[]
def handle_starttag(self,tag,attrs):
if tag=='a':
for i in attrs:
if i[0]=='href':
self.value=i[1]
def handle_data(self,data):
if data.startswith('Next'):
if (self.domain!='' )and ('://' not in self.value):
self.next.append(self.domain+self.value)
else:
self.next.append(self.value)
#setp 2. 下载当前网页,并根据解析结果,下载下一个网页。
def getLinks(url,domain):
doing=[url]
done=[]
cnt=0;
while len(doing)>=1:
x=doing.pop();
done.append(x)
cnt=cnt+1;
print('start:',x)
try:
f=urllib.request.urlopen(x,timeout=120)
s=f.read()
f.close()
fx=open(os.path.join(os.getcwd(),'data','{0}.html'.format(str(cnt))),'wb') #需要在当前目录建立data文件夹
      fx.write(s)
fx.close()
parser=LinkParser(strict=False,domain=domain)
parser.feed(s.decode())
for i in parser.next:
if i not in done:
doing.insert(0,i)
parser.next=[]
print('ok:',x)
except:
print('error:',x)
print(sys.exc_info())
continue
return done
if __name__=='__main__':
getLinks('http://www.iyunv.com/','http://www.iyunv.com/')
2. 从网页抽取信息
  网页已经下载下来了,现在需要把信息从网页上抽取出来。
  经过分析,每个网页上列出了20条记录,每条记录包含标题,作者,发布时间,推荐等信息。
  怎样把这些给抽取出来呢?
  先写一个小的程序,看看Python是怎么解析这些数据的:
  数据:


DSC0000.gif DSC0001.gif








10

   

      

python——常用功能之文本处理                  

前言在生活、工作中,python一直都是一个好帮手。在python的众多功能中,我觉得文本处理是最常用的。下面是平常使用中的一些总结。环境是python 3.30. 基础在python中,使用str对象来保存字符串。str对象的建立很简单,使用单引号或双引号或3个单引号即可。例如:s='nice' ...
              
                    
ola2010
发布于 2013-08-18 21:27

评论(4)阅读(1640)





View Code   代码:



from html.parser import HTMLParser
import os,urllib.request,sys
#一个简单的html解析器,主要用于看看Python对html的解析步骤
class TestParser(HTMLParser):
def __init__(self,strict=False):
HTMLParser.__init__(self,strict)
self.current=0
def handle_starttag(self,tag,attrs):
print(tag,':',attrs)
def handle_data(self,data):
print(self.current,'data:',data.strip())
self.current=self.current+1
if __name__=='__main__':
parser=TestParser(strict=False)
f=open(os.path.join(os.getcwd(),'test.txt'),encoding='utf-8')
s=f.read()
f.close()
parser.feed(s)
  通过小程序,确定好处理顺序之后,然后就可以将这些数据一步一步地抽取出来了。之前有一篇博客python——有限状态机写到怎么提取信息。
  代码:



from html.parser import HTMLParser
import os,urllib.request,sys
#parser of content
class ContentParser(HTMLParser):
def __init__(self,strict=False):
HTMLParser.__init__(self,strict)
self.state=0
self.title=''
self.author=''
self.time=''
self.comment=''
self.view=''
self.result=[]
def handle_starttag(self,tag,attrs):
if self.state==0:
if tag=='a':
for i in attrs:
if i[0]=='class' and i[1]=='titlelnk':
self.state=1   #title         
elif self.state==2:
if tag=='div':
for i in attrs:
if i[0]=='class' and i[1]=='post_item_foot':
self.state=3
elif self.state==3:
if tag=='a':
self.state=4  #author
elif self.state==5:
if tag=='span':
for i in attrs:
if i[0]=='class' and i[1]=='article_comment':
self.state=6
elif self.state==6:
if tag=='span':
for i in attrs:
if i[0]=='class' and i[1]=='article_view':
self.state=7
def handle_data(self,data):
if self.state==1:
self.title=data.strip()
self.state=2
elif self.state==4:
self.author=data.strip()
self.state=5
elif self.state==5:
self.time=data.strip()[-16:]
elif self.state==6:
self.comment=data.strip()[3:-1]
elif self.state==7:
self.view=data.strip()[3:-1]
self.result.append((self.title,self.author,self.time,self.comment,self.view))
self.state=0
def getContent(file_name):
parser=ContentParser(strict=False)
f=open(os.path.join(os.getcwd(),'data',file_name),encoding='utf-8')
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)
  这样,就将结果提取出来了。

3. 分析这些数据
  因为我们是以tab键分割这些数据的,所以可以导入到excel中:
  经统计:



2013-05-22 16:222013-08-20 19:573个月的时间里:
1356个人发布4000篇博客到博客园首页,平均每天44.4篇,每人3篇;
其中,最高的一人发布了55篇;
所有的文章总共被查看4661643次,评论35210次,平均132次查看会有一次评论
  

抛砖引玉
  1. 除了上述统计信息之外,是否可以找到一个星期中,那一天博客发表的最多?那一天最少?哪个人的评论最多?哪些主题关注度最大?
  2. 互联网的数据有很多,只要肯动手,就能获取想要的信息。不仅仅是博客园的这些统计信息,也可以是其他网站的。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58905-1-1.html 上篇帖子: eclipse + Pydev 配置Python开发环境 下篇帖子: Python天天美味(35)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表