项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

在网络上看到有介绍python爬虫爬去糗事百科段子的文章,觉得还挺好玩的,所以照着文章的思路自己重新实现了代码,完成了一个小小的爬虫爬取数据的例子。

1.抓取页面的源码

首先我们确定好页面的URL是 http://www.qiushibaike.com/hot/page/1,其中最后一个数字1代表页数,我们可以传入不同的值来获得某一页的段子内容。

首先来一段基本的页面抓取代码

def base_test():page = 1url = 'http://www.qiushibaike.com/hot/page/' + str(page)    try:request = urllib2.Request(url)response = urllib2.urlopen(request)except urllib2.URLError,e:if hasattr(e, "code"):print e.codeif hasattr(e,"reason"):print e.reasonbase_test()

运行以后,代码坑坑报了一堆错:

...File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 453, in beginversion, status, reason = self._read_status()File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 417, in _read_statusraise BadStatusLine(line)
httplib.BadStatusLine: ''

2.加入header信息

根据上面报的错,应该是header的原因。把header加上吧:

def base_test():page = 1url = 'http://www.qiushibaike.com/hot/page/' + str(page) user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = { 'User-Agent' : user_agent }   try:request = urllib2.Request(url,headers=headers)response = urllib2.urlopen(request)print response.read()except urllib2.URLError,e:if hasattr(e, "code"):print e.codeif hasattr(e,"reason"):print e.reasonbase_test()

运行代码,这次OK了,成功显示出来第一页的html代码,如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="chrome=1,IE=edge">
<meta name="renderer" content="webkit"/>
<meta name="applicable-device" content="pc">
<title>
...

后面还有很多内容,就不全贴了。

3.提取段子

为了方便查看网页的html代码,我们在页面任意位置右击,选择查看源代码,然后以某一个段子为例,看看他的html结构:

假设我们的目的是提取:1.段子的作者;2.段子的内容; 3.段子的点评数。对于第一个目的,被h2标签包围的就是作者,被div class="content"包围的是具体内容,被i class="number"包围的是点评数量。

采用正则的方式,可以分别将以上我们感兴趣的内容提取出来:

def parse_html():page = 1url = 'http://www.qiushibaike.com/hot/page/' + str(page)user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = { 'User-Agent' : user_agent }try:request = urllib2.Request(url,headers = headers)response = urllib2.urlopen(request)content = response.read().decode('utf-8')pattern_author = re.compile(u'<h2>(.*?)</h2>',re.S)pattern_content = re.compile(u'<div class="content">(.*?)</div>',re.S)pattern_comment = re.compile(u'<i class="number">(\d*)</i>\s*评论',re.S)            find_author = re.findall(pattern_author,content)find_content = re.findall(pattern_content,content)find_comment = re.findall(pattern_comment,content)if find_author:for i in xrange(len(find_author)):result = str(i)+" "+find_author[i]+" "+find_content[i]+" "+str(find_comment[i])print resultexcept urllib2.URLError, e:if hasattr(e,"code"):print e.codeif hasattr(e,"reason"):print e.reasonparse_html()

如果对正则不是很熟的同学,可以参考以下:

  1. ".“是通配符,”*“表示匹配0次或任意次,”?"表示非贪婪匹配,.*?组合在一起则表示尽可能短地做匹配。
  2. (.*?)代表一个分组,或者说一个捕获组。
  3. re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。
    上面我们通过三个正则表达式分别找出了发帖人,内容以及点评数。

让代码运行起来:

0 郭思雨 真事!昨天公司组织开会。领导说带好你们吃饭的家伙到办公室集合。结果到办公室一看同事们都带着笔记本。而我特么却拿了一个碗。348
1 王医森 不愧是母女仨儿1
2 onepiece美凌格 最近好多人来这个贴左下,为了方便大家我再发一次<br/>专捉小人,速速左下让小人远离你!66...

##4.修改正则,使结果更美观
观察上面结果,再结合之前的html源码,发现结果不是很美观,主要是由于空格与换行符引起的。为此,我们修改一下代码:

def parse_html():page = 1url = 'http://www.qiushibaike.com/hot/page/' + str(page)user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = { 'User-Agent' : user_agent }try:request = urllib2.Request(url,headers = headers)response = urllib2.urlopen(request)content = response.read().decode('utf-8')pattern_author = re.compile(u'<h2>(.*?)\s*</h2>',re.S)pattern_content = re.compile(u'<div class="content">\s*(.*?)\s*</div>',re.S)pattern_comment = re.compile(u'<i class="number">(\d*)</i>\s*评论',re.S)           find_author = re.findall(pattern_author,content)find_content = re.findall(pattern_content,content)find_comment = re.findall(pattern_comment,content)if find_author:for i in xrange(len(find_author)):content= find_content[i].replace("<br/>",",")result = str(i)+" "+find_author[i]+" "++" "+str(find_comment[i])print resultexcept urllib2.URLError, e:if hasattr(e,"code"):print e.codeif hasattr(e,"reason"):print e.reasonparse_html()

改动主要有两处:
1.将匹配处的空格去除,不在捕获组里。
2.将内容中的br换行标签去除。

最后的结果:

0 郭思雨 真事!昨天公司组织开会。领导说带好你们吃饭的家伙到办公室集合。结果到办公室一看同事们都带着笔记本。而我特么却拿了一个碗。 352
1 王医森 不愧是母女仨儿 1
2 onepiece美凌格 最近好多人来这个贴左下,为了方便大家我再发一次,专捉小人,速速左下让小人远离你! 66
3 院长!放我出院! 我爸的网名:点点爸,我妈的网名:点点妈,不知道的都以为我叫点点,点点其实是我家的狗! 447
4 .似水年华 夏天到了 天气很热 许多男孩包括我喜欢把体恤向上卷起来 漏出脊背凉快 但是 我要说的是一些吨位较大的男生 把体恤提到胃部左右立刻 不要再往上漏出咪咪 这是对一些平胸妹子最基本尊重!!! 151
5 帅哥之神 谁被占便宜了 8
6 陌上芊芊蔚 老公在看书,我在看糗百,他瞅了我一眼,说:你能看点有营养的吗。。。。,我说:好啊!!,于是我默默的打开了淘宝。,没一会儿,他回过头跟我说:你还是看糗百吧,省钱。。。。。。 23
7 我是个小耳朵 我们寝室一起出去找兼职,走到小吃店,人家问要吃点什麽,我还没来得及问要不要找兼职,那几个人就纷纷报出了自己要吃的东西。。尼玛,本性难移 10
8 仅存~执念 今天是我们结婚10周年纪念日,想到老公以前写的情书经常有:“我心里有个小兔子在乱撞呢。”,问他:“老公,你心里的那个小兔子呢?”老公:“早撞死了!” 37
9 一顶砖 大哥你这么怒气冲冲的是要去替天行道吗?~ 19
10 丢了自己的百毒 学霸老妹跟同学出去逛街,回来买了好多东西,我:你都没带多少钱,怎么能买这么多东西?,老妹:她们天天抄我作业,所以我不管买什么东西,她们都抢着付钱~,书中自有黄金屋,古人诚不欺我…… 40
11 小斐之家成人用品 夏天和老爸一起去吃饭,吃了俩王八,又喝了一箱啤酒。结账的时候,老板娘问服务员:“他们吃了什么?”那服务业说:“俩王八喝了一箱啤酒。”然后,老板娘只算了啤酒的钱,王八钱没算。 123
12 隔壁伱王叔 某日晚上,护城河边有一女子欲寻短见,围观者众。突然有一男子奋不顾身,跃入两米深的河中救人,众人正为此人义举赞赏不已。岂知,那男子心急火燎地游至女子身边一看,啊,不是我老婆啊! 25
13 封存の记忆 大学的时候,有个老师讲课极其无聊,有一次他讲到一半的时候我突然醒了,因为想起来校长坐我旁边听课,---扭头一看,校长睡着了.... 67
14 取什么名儿++/呢 我妈让我不要跟学习比我差的同学玩,于是我去找学习委员。学习委员说:“我妈不让我跟学习比我差的同学玩”。 115
15 黄88 就剩下二百块钱了,我躺床上想了一天,这二百块钱怎么才能坚持花到发工资,现在好了,不用想了!我特么把钱丢了!!! 190
16 冰是睡着的水21 老婆的闺密很时尚!一天来我家看到我女儿打扮的不潮,就喊着老婆带着孩子去了理发店,烫了个发~染了个颜色!,结果第二天上课:女儿被校长留在了办公室!还要叫家长!!尼玛的时尚出事了吧! 38
17 大大白萝卜 上初中的时候,都喜欢看电子书,背景,当时看的是都市小说,里面有段啪啪,上课看着看着年轻漂亮的英语老师下来了,搞的手忙脚乱把手机塞到书底下,不知道咋的点了语音读书,然后就听见啊……恩……轻点……痛……然后就没了 53
18 啊喂、切克闹 旅馆走廊上,挂着一块牌子,上面写着:“请夜间保持安静,切勿打扰旅客休息。”,第二天早晨,人们发现牌子上这行字的下面又添了一行小字:“要是老鼠也认字,那该多好!” 36
19 跳舞的袜子 大学时候睡上铺的哥们喜欢同班的一姑娘,跑去要号码,那女孩把班长的号码给了他,结果两爷们短信聊了一学期.... 174

这样就比较清晰了。怎么样,很酷吧!

python 爬虫 爬取糗事百科段子相关推荐

  1. python爬虫爬取糗事百科

    最近研究python爬虫,按照网上资料实现了python爬虫爬取糗事百科,做个笔记. 分享几个学习python爬虫资料: 廖雪峰python教程 主要讲解python的基础编程知识 python开发简 ...

  2. 网络爬虫---爬取糗事百科段子实战

    Python网络爬虫 1.知识要求 掌握python基础语法 熟悉urllib模块知识 熟悉get方法 会使用浏览器伪装技术 如果您对相关知识遗忘了,可以点上面的相关知识链接,熟悉一下. 2.爬取糗事 ...

  3. Python之爬取糗事百科段子实战

    "简说Python",选择"置顶/星标公众号" 福利干货,第一时间送达! 阅读本文大约6分钟,实战学习,老表建议你反复看,反复记,反复练. // 本文作者 王豪 ...

  4. 爬虫爬取糗事百科段子

    目录 糗事百科段子爬取 爬虫功能介绍 所需软件 网页解析 找到所需信息所在代码段 获取信息 编程思路分析 获取当前所有段子 对提取的内容进行优化 数据合并 查看点赞数最多的内容 总结 最后 附代码 糗 ...

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

    今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单.程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该 ...

  6. python爬虫经典段子_Python爬虫-爬取糗事百科段子

    闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url 2.先抓取HTML页面 importurllibimpo ...

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

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

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

    Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...

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

    点我进入原文 另外, 中间遇到两个问题: 1. ascii codec can't decode byte 0xe8 in position 0:ordinal not in range(128) 解 ...

  10. 【Python爬虫系列教程 28-100】小姐姐带你入门爬虫框架Scrapy、 使用Scrapy框架爬取糗事百科段子

    文章目录 Scrapy快速入门 安装和文档: 快速入门: 创建项目: 目录结构介绍: Scrapy框架架构 Scrapy框架介绍: Scrapy框架模块功能: Scrapy Shell 打开Scrap ...

最新文章

  1. el-input怎么绑定回车事件
  2. 七个算法小仙女,写出一本1200页的深度学习技术手册!(限时公开下载)
  3. JS 获取指定时间的时间戳(兼容各个浏览器)
  4. php 特殊字符大全,关于php 特殊字符的文章推荐
  5. 怎么取消任意Windows窗口总在最前
  6. # 删除注册表项键值_强制删除:让你的电脑上不再有“顽固”程序
  7. RichTextBox 右键显示 ContextMenuTrip
  8. 一家很好的iPhone应用程序开发公司——易标科技
  9. 程序员面试、算法研究、编程艺术、红黑树4大系列集锦与总结
  10. VS Code 1.18版本更新内容整理(2017年10月 October 2017)
  11. Info.plist与Prefix.pch修改文件位置遇到的问题及解决方法
  12. android 微积分计算器,不到1M的良心之作 连微积分都能算的计算器APP
  13. android音乐播放器歌词乱码,手机听歌显示乱码 没歌词 教你如何一键解决
  14. python期货程序化交易高手_Python版商品期货跨期对冲策略 (教学)
  15. Oracle的子查询【单行子查询和多行子查询】
  16. python中lcut什么意思_python中如何画火山图
  17. 记lrd的高二上学期第五次调研考试
  18. 为什么element ui 中表单验证validate验证成功不执行验证成功的逻辑代码
  19. Prometheus监控神技--自动发现配置
  20. 推荐书目《wireshark网络分析就是这么简单》

热门文章

  1. HTML(超文本标记语言)的内容和理解
  2. 独角兽复活:Twilio上市预示IPO市场起死回生
  3. 十一月份英语学习总结—积累
  4. split添加limit参数
  5. 心理平衡其实就这么简单
  6. 3.python(第三天日记)
  7. 《CMOS集成电路后端设计与实战》——第2章 集成电路后端设计方法
  8. 深度 | 机器学习敲门砖:任何人都能看懂的TensorFlow介绍【转】
  9. 烂泥:KVM虚拟机的关机与开启
  10. 说白了 枚举是一个对象中属性的参数值