问题导读
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]
|
|