零基础写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遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
python导入模块交叉引用的方法
Jan 19 Python
详解python执行shell脚本创建用户及相关操作
Apr 11 Python
python中比较两个列表的实例方法
Jul 04 Python
Python Pandas 箱线图的实现
Jul 23 Python
Django 大文件下载实现过程解析
Aug 01 Python
Python实现自定义读写分离代码实例
Nov 16 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
Jun 30 Python
在Django中使用MQTT的方法
May 10 Python
python 如何执行控制台命令与操作剪切板
May 20 Python
Python绘画好看的星空图
Mar 17 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 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
详解vue-cli中配置sass
2017/06/21 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
JS实现前端动态分页码代码实例
2020/06/02 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
python安装以及IDE的配置教程
2015/04/29 Python
Python单链表简单实现代码
2016/04/27 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
益模软件Java笔试题
2012/03/27 面试题
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
《云雀的心愿》教学反思
2014/02/25 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
行政二审代理词
2015/05/25 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记