零基础写python爬虫之抓取糗事百科代码分享


Posted in Python onNovember 06, 2014

项目内容:

用Python写的糗事百科的网络爬虫。

使用方法:

新建一个Bug.py文件,然后将代码复制到里面后,双击运行。

程序功能:

在命令提示行中浏览糗事百科。

原理解释:

首先,先浏览一下糗事百科的主页:http://www.qiushibaike.com/hot/page/1
可以看出来,链接中page/后面的数字就是对应的页码,记住这一点为以后的编写做准备。
然后,右击查看页面源码:

零基础写python爬虫之抓取糗事百科代码分享

观察发现,每一个段子都用div标记,其中class必为content,title是发帖时间,我们只需要用正则表达式将其“扣”出来就可以了。
明白了原理之后,剩下的就是正则表达式的内容了,可以参照这篇文章:
https://3water.com/article/57150.htm

运行效果:

零基础写python爬虫之抓取糗事百科代码分享

# -*- coding: utf-8 -*-    

     

import urllib2    

import urllib    

import re    

import thread    

import time      

#----------- 加载处理糗事百科 -----------    

class Spider_Model:    

        

    def __init__(self):    

        self.page = 1    

        self.pages = []    

        self.enable = False    

    

    # 将所有的段子都扣出来,添加到列表中并且返回列表    

    def GetPage(self,page):    

        myUrl = "http://m.qiushibaike.com/hot/page/" + page    

        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'   

        headers = { 'User-Agent' : user_agent }   

        req = urllib2.Request(myUrl, headers = headers)   

        myResponse = urllib2.urlopen(req)  

        myPage = myResponse.read()    

        #encode的作用是将unicode编码转换成其他编码的字符串    

        #decode的作用是将其他编码的字符串转换成unicode编码    

        unicodePage = myPage.decode("utf-8")    

    

        # 找出所有class="content"的div标记    

        #re.S是任意匹配模式,也就是.可以匹配换行符    

        myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)    

        items = []    

        for item in myItems:    

            # item 中第一个是div的标题,也就是时间    

            # item 中第二个是div的内容,也就是内容    

            items.append([item[0].replace("\n",""),item[1].replace("\n","")])    

        return items    

    

    # 用于加载新的段子    

    def LoadPage(self):    

        # 如果用户未输入quit则一直运行    

        while self.enable:    

            # 如果pages数组中的内容小于2个    

            if len(self.pages) < 2:    

                try:    

                    # 获取新的页面中的段子们    

                    myPage = self.GetPage(str(self.page))    

                    self.page += 1    

                    self.pages.append(myPage)    

                except:    

                    print '无法链接糗事百科!'    

            else:    

                time.sleep(1)    

            

    def ShowPage(self,nowPage,page):    

        for items in nowPage:    

            print u'第%d页' % page , items[0]  , items[1]    

            myInput = raw_input()    

            if myInput == "quit":    

                self.enable = False    

                break    

            

    def Start(self):    

        self.enable = True    

        page = self.page    

    

        print u'正在加载中请稍候......'    

            

        # 新建一个线程在后台加载段子并存储    

        thread.start_new_thread(self.LoadPage,())    

            

        #----------- 加载处理糗事百科 -----------    

        while self.enable:    

            # 如果self的page数组中存有元素    

            if self.pages:    

                nowPage = self.pages[0]    

                del self.pages[0]    

                self.ShowPage(nowPage,page)    

                page += 1    

     

#----------- 程序的入口处 -----------    

print u"""  

---------------------------------------  

   程序:糗百爬虫  

   版本:0.3  

   作者:why  

   日期:2014-06-03  

   语言:Python 2.7  

   操作:输入quit退出阅读糗事百科  

   功能:按下回车依次浏览今日的糗百热点  

---------------------------------------  

"""  

print u'请按下回车浏览今日的糗百内容:'    

raw_input(' ')    

myModel = Spider_Model()    

myModel.Start()   

Q&A:
1.为什么有段时间显示糗事百科不可用?
答:前段时间因为糗事百科添加了Header的检验,导致无法爬取,需要在代码中模拟Header。现在代码已经作了修改,可以正常使用。

2.为什么需要单独新建个线程?
答:基本流程是这样的:爬虫在后台新起一个线程,一直爬取两页的糗事百科,如果剩余不足两页,则再爬一页。用户按下回车只是从库存中获取最新的内容,而不是上网获取,所以浏览更顺畅。也可以把加载放在主线程,不过这样会导致爬取过程中等待时间过长的问题。

Python 相关文章推荐
Python验证企业工商注册码
Oct 25 Python
python基础教程之五种数据类型详解
Jan 12 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
python实现感知器算法详解
Dec 19 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
Python中反射和描述器总结
Sep 23 Python
python画微信表情符的实例代码
Oct 09 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
Python的历史与优缺点整理
May 26 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
一文搞懂python异常处理、模块与包
Jun 26 Python
python中的random模块和相关函数详解
Apr 22 Python
零基础写python爬虫之神器正则表达式
Nov 06 #Python
零基础写python爬虫之抓取百度贴吧代码分享
Nov 06 #Python
零基础写python爬虫之urllib2使用指南
Nov 05 #Python
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
Nov 05 #Python
零基础写python爬虫之HTTP异常处理
Nov 05 #Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 #Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 #Python
You might like
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
php HTML无刷新提交表单
2016/04/05 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
一个tab标签切换效果代码
2009/03/27 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
JavaScript简介
2015/02/15 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
python两种注释用法的示例
2020/10/09 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
华三通信H3C面试题
2015/05/15 面试题
河童之夏观后感
2015/06/11 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL