最近刚学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'
运行一下 效果如图