今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单。程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该博主的代码似乎有些问题,我自己做了修改,运行成功,下面是代码内容:

 # -*- coding:utf-8 -*-
__author__ = 'Jz'
import urllib2
import re #糗事百科爬虫类
class QSBK:
#初始化
def __init__(self):
self.pageIndex = 1
self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64)'
self.headers = {'User-Agent': self.user_agent}
#joke的每一个元素是每一页的段子
self.joke = []
#判断是否继续运行
self.enable = False def getPage(self, pageIndex):
try:
URL = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
request = urllib2.Request(url = URL, headers = self.headers)
response = urllib2.urlopen(request)
pageContent = response.read().decode('utf-8')
return pageContent
except urllib2.URLError, e:
if hasattr(e, 'reason'):
print '段子抓取失败,失败原因:', e.reason
return None def getJokeList(self, pageIndex):
pageContent = self.getPage(pageIndex)
if not pageContent:
print '段子获取失败...'
return None
#第三个组中的内容用于判断段子是否附带图片
pattern = re.compile(r'<div.*?class="author">.*?<a.*?>.*?<img.*?/>\n(.*?)\n</a>.*?</div>.*?<div class="content">\n\n(.*?)\n<!--.*?-->.*?</div>' +
r'(.*?)class="stats">.*?<span.*?class="stats-vote"><i.*?class="number">(.*?)</i>'
, re.S)
jokes = re.findall(pattern, pageContent)
pageJokes = []
#过滤带有图片的段子
for joke in jokes:
hasImg = re.search('img', joke[2])
#joke[0]为发布人,joke[1]为段子内容,joke[3]为点赞数量
if not hasImg:
pageJokes.append([joke[0].strip(), joke[1].strip(), joke[3].strip()])
return pageJokes def loadPage(self):
if self.enable == True:
#若当前已看的页数少于两页,则加载新的一页
if len(self.joke) < 2:
pageJokes = self.getJokeList(self.pageIndex)
if pageJokes:
self.joke.append(pageJokes)
self.pageIndex += 1 #每输入一次回车,打印一条段子
def getOneJoke(self, pageJokes, page):
jokes = pageJokes
for joke in jokes:
userInput = raw_input('请输入回车键或Q/q: ')
self.loadPage()
if userInput == 'Q' or userInput == 'q':
self.enable = False
print '退出爬虫...'
return
print u'段子内容:%s\n第%d页\t发布人:%s\t赞:%s' % (joke[1], page, joke[0], joke[2]) def start(self):
print '正在从糗事百科抓取段子,按回车键查看新段子,按Q/q退出...'
self.enable = True
self.loadPage()
page = 0
while self.enable:
if len(self.joke) > 0:
pageJokes = self.joke[0]
page += 1
#删除已经读取过的段子页
del self.joke[0]
self.getOneJoke(pageJokes, page) spider = QSBK()
spider.start()

注释已经附上,其中有几点需要注意的地方:

1.需要加上header验证进行伪装,否则无法抓取网页内容

2.正则表达式的书写,需要将内容提取出来以验证是否有附带图片(代码中已用红色标注)

3.getOneJoke函数中格式化输出段子时(已用红色标注),需要在字符串前加上u,否则会报如下错误:

Traceback (most recent call last):
File "D:\coding_file\python_file\TestPython\src\Test\QSBK.py", line 84, in <module>
spider.start()
File "D:\coding_file\python_file\TestPython\src\Test\QSBK.py", line 81, in start
self.getOneJoke(pageJokes, page)
File "D:\coding_file\python_file\TestPython\src\Test\QSBK.py", line 68, in getOneJoke
print '段子内容:%s\n第%d页\t发布人:%s\t赞:%s' % (joke[1], page, joke[0], joke[2])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 3: ordinal not in range(128)

这是因为Python默认编码方式为Unicode,所以joke[0]等也是Unicode编码,为了格式化输出,前面的字符串也需要转换成Unicode编码

Python爬虫--抓取糗事百科段子的更多相关文章

  1. Python爬虫爬取糗事百科段子内容

    参照网上的教程再做修改,抓取糗事百科段子(去除图片),详情见下面源码: #coding=utf-8#!/usr/bin/pythonimport urllibimport urllib2import ...

  2. Python爬虫-爬取糗事百科段子

    闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/h ...

  3. python学习(十六)写爬虫爬取糗事百科段子

    原文链接:爬取糗事百科段子 利用前面学到的文件.正则表达式.urllib的知识,综合运用,爬取糗事百科的段子先用urllib库获取糗事百科热帖第一页的数据.并打开文件进行保存,正好可以熟悉一下之前学过 ...

  4. Python爬虫批量下载糗事百科段子,怀念的天王盖地虎,小鸡炖蘑菇...

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  5. 8.Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  6. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  7. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  8. 芝麻HTTP:Python爬虫实战之爬取糗事百科段子

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...

  9. python 爬虫实战1 爬取糗事百科段子

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 本篇目标 抓取糗事百科热门段子 过滤带有图片的段子 实现每按一次回车显示一个段子的发布时间,发布人 ...

随机推荐

  1. sql server 中having 的使用注意事项

    1.having 中不能使用未参与分列的组,having 不能替代where 作用不一样,having是对组进行过滤,where是每条记录进行过滤. 2.having 是对Group By 的条件分组 ...

  2. PAT 天梯赛 L1-014. 简单题 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-014 AC代码 #include <iostream> #include <cstdio&g ...

  3. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) D. Artsem and Saunders

    地址:http://codeforces.com/contest/765/problem/D 题目: D. Artsem and Saunders time limit per test 2 seco ...

  4. java注解1

    http://computerdragon.blog.51cto.com/6235984/1210969 http://blog.csdn.net/it_man/article/details/440 ...

  5. Entity FrameWork Code First 之Model分离

    之前一直用DB First新建类库进行使用,最近开始研究Code First.Code First也可以将Model新建在类库里面,然后通过数据迁移等操作生成数据库. 现在说下主要步骤: 1.新建类库 ...

  6. Java开发资料汇编

    Java开发常识资料   一.Java基础JSE 核心基础(程序设计语言):        <Think in java> (参考阅读:<Core Java>JAVA2核心技术 ...

  7. 会话控制Cookie的应用

    Cookie是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上,在客户端对服务器的请求中发回它.PHP透明地支持HTTP Cookie.可以利用他在远程浏览器端存储数据并以此来跟 ...

  8. python——动态类型简介

    动态类型简介 类型属于对象,而不是变量 每一个对象都有两个标准的头部信息:类型标志符和引用计数器. 对象的垃圾收集,就是通过引用计数器实现的.可以在脚本中任意使用对象而不需要考虑释放内存空间. 循环饮 ...

  9. Spring AOP(5)-- 注解

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?><beans xml ...

  10. 《Computational Statistics with Matlab》硬译

    第1章 从随机变量采样 研究者提出的概率模型对于分析方法来说通常比较复杂,研究者处理复杂概率模型时越来越依赖计算.数值方法,通过使用计算方法,研究者就不用对一些分析技术做一些不现实的假设(如正态性和独 ...