零基础写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 time模块详解(常用函数实例讲解,非常好)
Apr 24 Python
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
Mar 31 Python
python中sleep函数用法实例分析
Apr 29 Python
Python使用multiprocessing创建进程的方法
Jun 04 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
Python tkinter事件高级用法实例
Jan 31 Python
运行django项目指定IP和端口的方法
May 14 Python
python issubclass 和 isinstance函数
Jul 25 Python
django框架创建应用操作示例
Sep 26 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
python3.7添加dlib模块的方法
Jul 01 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 ci框架验证码实例分析
2013/06/26 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
php生出随机字符串
2017/07/06 PHP
JQuery中$之选择器用法介绍
2011/04/05 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
详解python3百度指数抓取实例
2016/12/12 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
python保存网页图片到本地的方法
2018/07/24 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
django的csrf实现过程详解
2019/07/26 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
python实现超级马里奥
2020/03/18 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
教师师德师风个人整改方案
2014/09/18 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android
mysql的Buffer Pool存储及原理
2022/04/02 MySQL