零基础写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实现提取文章摘要的方法
Apr 21 Python
Python线程详解
Jun 24 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
python读取txt文件并取其某一列数据的示例
Feb 19 Python
python七夕浪漫表白源码
Apr 05 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
python异常触发及自定义异常类解析
Aug 06 Python
python爬虫可以爬什么
Jun 16 Python
Python实时监控网站浏览记录实现过程详解
Jul 14 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Python利用capstone实现反汇编
Apr 06 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获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
php实现的mongodb操作类
2015/05/28 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
js计算精度问题小结
2013/04/22 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
从Python的源码来解析Python下的freeblock
2015/05/11 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
PyQt5组件读取参数的实例
2019/06/25 Python
python程序输出无内容的解决方式
2020/04/09 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
给国外客户的邀请函
2014/01/30 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
企业宣传语大全
2015/07/13 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
关于Vue中的options选项
2022/03/22 Vue.js
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android