零基础写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常见数据结构详解
Jul 24 Python
python和shell实现的校验IP地址合法性脚本分享
Oct 23 Python
python tornado微信开发入门代码
Aug 24 Python
python 异或加密字符串的实例
Oct 14 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
使用pandas读取文件的实现
Jul 31 Python
numpy.array 操作使用简单总结
Nov 08 Python
Python yield生成器和return对比代码实例
Apr 20 Python
python批量生成条形码的示例
Oct 10 Python
Python日志模块logging用法
Jun 05 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日期时间函数的高级应用技巧
2009/05/16 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
React快速入门教程
2017/01/17 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
js实现轮播图特效
2020/05/28 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
Python高级用法总结
2018/05/26 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
成功的酒店创业计划书
2013/12/27 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
家长写给孩子的评语
2014/04/18 职场文书
质量承诺书怎么写
2014/05/24 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
培训通知书模板
2015/04/17 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
解决xampp安装后Apache无法启动
2022/03/21 Servers
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电