零基础写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 相关文章推荐
ptyhon实现sitemap生成示例
Mar 30 Python
python实现自动更换ip的方法
May 05 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Python3之手动创建迭代器的实例代码
May 22 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
Python包和模块的分发详细介绍
Jun 19 Python
Python函数调用追踪实现代码
Nov 27 Python
Python机器学习之基于Pytorch实现猫狗分类
Jun 08 Python
总结三种用 Python 作为小程序后端的方式
May 02 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
php5.3 废弃函数小结
2010/05/16 PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
2011/06/10 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
读jQuery之一(对象的组成)
2011/06/11 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
详解jQuery选择器
2016/12/21 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
python列表去重的二种方法
2014/02/14 Python
Python去除列表中重复元素的方法
2015/03/20 Python
python单例模式实例分析
2015/04/08 Python
Python的Flask开发框架简单上手笔记
2015/11/16 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python高斯消除矩阵
2019/01/02 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python分布式计算dispy的使用详解
2019/12/22 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
后勤部经理岗位职责
2014/02/23 职场文书
高一新生军训感言
2014/03/02 职场文书
出生医学证明书
2014/09/15 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
老干部座谈会主持词
2015/07/03 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书