python简单爬取热门文字段子并自动浏览

来源:互联网 发布:r语言与matlab 大数据 编辑:程序博客网 时间:2024/06/04 17:43

最近刚学python的爬虫,意外找到转自崔庆才老师的爬虫实战教程,觉得不错。

这里是我的学习笔记,更好的教程在:http://python.jobbole.com/81351/
(不知道为什么,在学校登不进崔老师的博客,所以放一份伯乐在线网的转载)

实战目标
1.用requests模板抓取糗百热门的段子
2. 过滤所有带图片的段子
3 设定想浏览的页数、设定每隔多少时间刷新下个段子

IDE:Interactive Editor for Python
python 2.7.5

准备工作:安装requests模块,教程和下载http://cn.python-requests.org/en/latest/
这个模块好用的一笔,把系统的urllib 和 urllib2封装得很好。强烈建议使用

这里用一个也是在崔庆才老师博客摘下的Tool类,可以方便地清除抓到页面的大部分标签如”<\bn>“等(为了避免编辑器错误,故意把斜杠反过来了)

class Tool:    removeImg = re.compile('<img.*?>| {7}|')    #删除超链接标签    removeAddr = re.compile('<a.*?>|</a>')    #把换行的标签换为\n    replaceLine = re.compile('<tr>|<div>|</div>|</p>')    #将表格制表<td>替换为\t    replaceTD= re.compile('<td>')    #把段落开头换为\n加空两格    replacePara = re.compile('<p.*?>')    #将换行符或双换行符替换为\n    replaceBR = re.compile('<br><br>|<br>')    #将其余标签剔除    removeExtraTag = re.compile('<.*?>')    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.replaceTD,"\t",x)        x = re.sub(self.replacePara,"\n    ",x)1        x = re.sub(self.replaceBR,"\n",x)        x = re.sub(self.removeExtraTag,"",x)        #strip()将前后多余内容删除        return x.strip()

首先,用requests.get获取页面

    page=1    url='http://www.qiushibaike.com/hot/page/'+str(page)    r=requests.get(url)

快要完成目标1了,此时的 r.text即为内容,但我们要进一步处理。首先就是找出”文字内容
这里可以用美丽汤,我用的是正则表达
首先你要先看糗百的源代码:
网页源代码
稍后补图
可以看到,内容的前面是标签
\n\n<div class="content">\n\n
后面有这个糗百编号标签,然后是</div>,然后是若干空行再加紧跟标签
<div class="stats">
经过浏览知道,只有文字版的有stats这个标签,图片版的紧跟的是thumb和图片链接,然后才是stats

所以我们可以用正则筛选了:

match=re.findall(r'\n\n<div class="content">\n\n(.*)\n.*\n\n.*\n\n\n\n<div class="stats">',r.text.encode('utf-8'))#我们可以这样输出    for item in match:        print item.decode('utf-8')        print '-----------------------------------'

看了一下输出,发现有参杂进来的标签~
所以我们要用tool类清除多余标签
print print tool.replace((item.decode('utf-8')))

我们这里再加入计时功能:

   for item in match:        print tool.replace((item.decode('utf-8')))        print '-----------------------------------'        time.sleep(rate)``

这里rate是用户输入的数字

这样每隔rate秒就刷新一个新段子啦

综合起来,整个代码如下:

#coding=utf-8import requestsimport re,time#Tool对象用于删除CSS标签的类,来自崔庆才的Python教程class Tool:    #去除img标签,7位长空格    removeImg = re.compile('<img.*?>| {7}|')    #删除超链接标签    removeAddr = re.compile('<a.*?>|</a>')    #把换行的标签换为\n    replaceLine = re.compile('<tr>|<div>|</div>|</p>')    #将表格制表<td>替换为\t    replaceTD= re.compile('<td>')    #把段落开头换为\n加空两格    replacePara = re.compile('<p.*?>')    #将换行符或双换行符替换为\n    replaceBR = re.compile('<br><br>|<br>')    #将其余标签剔除    removeExtraTag = re.compile('<.*?>')    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.replaceTD,"\t",x)        x = re.sub(self.replacePara,"\n    ",x)1        x = re.sub(self.replaceBR,"\n",x)        x = re.sub(self.removeExtraTag,"",x)        #strip()将前后多余内容删除        return x.strip()tool=Tool()page=1target=input(u'客官今天想看多少页糗百?\n')rate=input(u'您希望隔几秒自动翻下一条糗百段子?\n')while page<=target:    url='http://www.qiushibaike.com/hot/page/'+str(page)    r=requests.get(url)    match=re.findall(r'\n\n<div class="content">\n\n(.*)\n.*\n\n.*\n\n\n\n<div class="stats">',r.text.encode('utf-8'))    for item in match:        print tool.replace((item.decode('utf-8')))        print '-----------------------------------'        time.sleep(rate)    page+=1print u'客官今天看的页面全部结束\n'

运行一下 效果如图

1 0
原创粉丝点击