零基础写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挑选文件夹里宽大于300图片的方法
Mar 05 Python
Python获取央视节目单的实现代码
Jul 25 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
Django自定义认证方式用法示例
Jun 23 Python
Python遍历numpy数组的实例
Apr 04 Python
TensorFlow实现随机训练和批量训练的方法
Apr 28 Python
python numpy中cumsum的用法详解
Oct 17 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
使用python+poco+夜神模拟器进行自动化测试实例
Apr 23 Python
python让函数不返回结果的方法
Jun 22 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
第七节--类的静态成员
2006/11/16 PHP
php时间戳转换的示例
2014/03/31 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
javascript 函数速查表
2010/02/07 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
django云端留言板实例详解
2019/07/22 Python
python时间日期操作方法实例小结
2020/02/06 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
python实现图像全景拼接
2020/03/27 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
旅游业大学生创业计划书
2014/01/31 职场文书
创业计划书如何编写
2014/02/06 职场文书
初中班干部工作总结
2015/08/10 职场文书
社区结对共建协议书
2016/03/23 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
html5调用摄像头实例代码
2021/06/28 HTML / CSS
Spring中bean集合注入的方法详解
2022/07/07 Java/Android
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript