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

最近刚学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-8
import requests
import 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=1
target=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+=1
print u'客官今天看的页面全部结束\n'


运行一下 效果如图

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值