零基础写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装饰器实现几类验证功能做法实例
May 18 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
Apr 05 Python
Python 查找字符在字符串中的位置实例
May 02 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Django中的Model操作表的实现
Jul 24 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
Python程序控制语句用法实例分析
Jan 14 Python
python实现的Iou与Giou代码
Jan 18 Python
python常见的占位符总结及用法
Jul 02 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设置图片文件上传大小的具体实现方法
2013/10/11 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
vue.js的提示组件
2017/03/02 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
Python3实现从指定路径查找文件的方法
2015/05/22 Python
Python使用gensim计算文档相似性
2016/04/10 Python
python常用函数详解
2016/09/13 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
python批量修改ssh密码的实现
2019/08/08 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
运动会入场解说词300字
2014/01/25 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
班级旅游计划书
2014/05/03 职场文书
社区安全生产月活动总结
2014/07/05 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
2014和解协议书范文
2014/09/15 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
mysql中between的边界,范围说明
2021/06/08 MySQL
javascript数组includes、reduce的基本使用
2021/07/02 Javascript