分享

Python抓取段子的爬虫

desehawk 发表于 2015-5-24 14:46:00 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 20891
问题导读

1.Python抓取段子的爬虫的需求是什么?
2.Python抓取段子的爬虫是如何实现的?
3.你认为该如何实现?








1.需求
按下回车键,显示一个段子,要求显示段子的作者、点赞数、评论数、顶等信息。

2.段子网站
地址:http://www.qiushibaike.com/hot/page/1,更换后面的数字可以获取不同页的段子,每页有10多条段子吧,因此爬虫从读取该网页并解析就好了。


3.实现方式
这里使用的Python库都是系统自带的,所以不需要安装额外的第三方库,使用的库主要是urllib2--用于获取网页内容,re-正则表达式解析获取网页信息。
其中urllib2需要注意设置header和以request的方式请求网页,而最主要的则是re正则表达式的写法了,这个见仁见智,我正则表达式不是很熟,也就能写个能用的,所以……质量不能保证哈。
获取的每个段子的内容基本都是这样子的:
[mw_shl_code=html,true]<div class="article block untagged mb15" id='qiushi_tag_106723566'>  
  
<div class="author">  
<a href="/users/14932928">  
<img src="http://pic.qiushibaike.com/system/avtnew/1493/14932928/medium/20141225021149.jpg" alt="王小婕" />  
</a>  
<a href="/users/14932928">王小婕 </a>  
</div>  
  
  
<div class="content">  
  
家里的哈士奇,训练捡东西一直没学会,直到有一天,兜里钱掉了,他丫叼着不撒口,从此学会捡钱了,有一天他和一个硬币较上劲了,叼不起来,丫的硬是用舌头舔回家……  
<!--2015-05-22 23:56:08-->  
  
</div>  
  
  
  
  
<div class="stats">  
<span class="stats-vote"><i class="number">16479</i> 好笑</span>  
<span class="stats-comments">  
  
  
<span class="dash"> · </span>  
<a href="/article/106723566?list=hot&s=4774673" id="c-106723566" class="qiushi_comments" title="120条评论" target="_blank">  
<i class="number">120</i> 回复  
</a>  
  
  
  
</span>  
</div>  
<div id="qiushi_counts_106723566" class="stats-buttons bar clearfix">  
<ul class="clearfix">  
<li id="vote-up-106723566" class="up">  
<a href="javascript:voting(106723566,1)" class="voting" data-article="106723566" id="up-106723566" title="16904个顶">  
<i class="iconfont" data-icon-actived="  [/mw_shl_code]

主要解析该内容就可以获取到一个段子了,这里这样处理的:

[mw_shl_code=html,true]#author 作者  
strRe = '<div.*?class="author".*?<a.*?<a.*?>(.*?)</a>'  
#content and datetime 内容和时间  
strRe += '.*?<div.*?class="content".*?>(.*?)<!--(.*?)--.*?</div>'  
#vote and comments 投票数和评论数  
strRe += '.*?<span.*?class="stats-vote".*?>.*?class="number".*?>(.*?)</i>.*?</span>.*?<*.?class="qiushi_comments".*?>.*?<i.*?>(.*?)</i>.*?</a>'  
#up 顶数  
strRe += '.*?<li.*?class="up".*?>.*?<span.*?class="number hidden".*?>(.*?)</span>'  
#down 踩数  
strRe += '.*?<li.*?class="down".*?>.*?<span.*?class="number hidden".*?>(.*?)</span>'  [/mw_shl_code]



4.代码实现
[mw_shl_code=html,true]#-*- coding: utf-8 -*-  
  
import urllib2  
import re  
  
page_num = 1  
page_url = 'http://www.qiushibaike.com/hot/page/'  
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
headers = {'User-Agent':user_agent}  
  
def GetAllJokes(cont):  
    #pattern = re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class="content".*?title="(.*?)">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)  
      
    strRe = '<div.*?class="author".*?<a.*?<a.*?>(.*?)</a>'  
    strRe += '.*?<div.*?class="content".*?>(.*?)<!--(.*?)--.*?</div>'  
    strRe += '.*?<span.*?class="stats-vote".*?>.*?class="number".*?>(.*?)</i>.*?</span>.*?<*.?class="qiushi_comments".*?>.*?<i.*?>(.*?)</i>.*?</a>'  
    strRe += '.*?<li.*?class="up".*?>.*?<span.*?class="number hidden".*?>(.*?)</span>'  
    strRe += '.*?<li.*?class="down".*?>.*?<span.*?class="number hidden".*?>(.*?)</span>'  
    pattern = re.compile(strRe, re.S)  
    items = re.findall(pattern,content)  
  
    jokes = []  
    for item in items:  
        joke={}  
        joke[u"作者"]="".join(item[0].split())  
        joke[u"正文"]="".join(item[1].split())  
        joke[u"时间"]=item[2]  
        joke[u"投票"]=item[3]  
        joke[u"评论数"]=item[4]  
        joke[u"顶"]=item[5]  
        joke[u"踩"]=item[6]  
  
        jokes.append(joke)  
    return jokes  
if __name__ == '__main__':  
        jokes = []  
        num = 1  
        while True:  
            if len(jokes)<=0:  
                print "update newly from internet..."  
                try:  
                    req = urllib2.Request(page_url+str(num),headers=headers)  
                    resp = urllib2.urlopen(req)  
                    content = resp.read().decode('utf8')  
                    content = content[content.find('<div class="article block untagged mb15"')::]  
                    jokes=GetAllJokes(content)  
                    num += 1  
                except urllib2.URLError,e:  
                    if hasattr(e, "code"):  
                        print e.code  
                    if hasattr(e, "reason"):  
                        print e.reason  
                    exit(-1)  
  
            joke = jokes[0]  
            del  jokes[0]  
            for i in joke:  
                print '%8s\t:\t%s'%(i,joke)  
            print '======================================================'  
            raw_input("presss enter key to continue...")  [/mw_shl_code]


5.输出示例

[mw_shl_code=html,true]C:\Python27\python.exe F:/SrcCode/Python/GetNewlyJokes/GetNewlyJokes.py  
update newly from internet...  
       踩    :   -475  
      正文    :   家里的哈士奇,训练捡东西一直没学会,直到有一天,兜里钱掉了,他丫叼着不撒口,从此学会捡钱了,有一天他和一个硬币较上劲了,叼不起来,丫的硬是用舌头舔回家……  
     评论数    :   130  
      作者    :   王小婕  
      时间    :   2015-05-22 23:56:08  
      投票    :   17899  
       顶    :   18374  
======================================================  
presss enter key to continue...  
       踩    :   -248  
      正文    :   今天学校歌舞大赛,有一群妹纸跳热舞,下面有一个男的开始喊XXX我爱你,可能是情侣关系,,当时脑抽喊了一句我也是,感觉旁边的人眼神都不对了,多亏当时跑得快呀  
     评论数    :   33  
      作者    :   小伙还可以啊  
      时间    :   2015-05-23 00:07:20  
      投票    :   8343  
       顶    :   8591  
======================================================  
presss enter key to continue...  [/mw_shl_code]







已有(5)人评论

跳转到指定楼层
zhujun182104906 发表于 2015-5-27 14:46:51
回复

使用道具 举报

rookiecc 发表于 2015-5-27 17:19:24
你好为什么不用SGMLParser或 BeautifulSoup第三方模块呢?
回复

使用道具 举报

rookiecc 发表于 2015-5-27 17:20:18
你好为什么不用SGMLParser或 BeautifulSoup第三方模块呢?
回复

使用道具 举报

xuliang123789 发表于 2016-1-11 19:05:43
太好了,学习一下,楼主,赞~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条