Python即时网络爬虫项目: 内容提取器的定义

1. 项目背景

在python即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间太多了(见上图),从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作中。

这个项目推出以后受到很大关注,因为开放源码,大家可以在现成源码基础上进一步开发。然而,Python3和Python2是有区别的,《Python即时网络爬虫项目: 内容提取器的定义》 一文的源码无法在Python2.7下使用,本文将发布一个Python2.7的内容提取器。

2. 解决方案

为了解决这个问题,我们把影响通用性和工作效率的提取器隔离出来,描述了如下的数据处理流程图:

QQ图片20161122092324.png

图中“可插拔提取器”必须很强的模块化,那么关键的接口有:

立即学习“Python免费学习笔记(深入)”;

标准化的输入:以标准的HTML DOM对象为输入

标准化的内容提取:使用标准的xslt模板提取网页内容

标准化的输出:以标准的XML格式输出从网页上提取到的内容

明确的提取器插拔接口:提取器是一个明确定义的类,通过类方法与爬虫引擎模块交互

3. 提取器代码

可插拔提取器是即时网络爬虫项目的核心组件,定义成一个类: GsExtractor 适用python2.7的源代码文件及其说明文档请从 github 下载

使用模式是这样的:

实例化一个GsExtractor对象

为这个对象设定xslt提取器,相当于把这个对象配置好(使用三类setXXX()方法)

把html dom输入给它,就能获得xml输出(使用extract()方法)

下面是这个GsExtractor类的源代码(适用于Python2.7)

#!/usr/bin/python# -*- coding: utf-8 -*-# 模块名: gooseeker_py2# 类名: GsExtractor# Version: 2.0# 适配Python版本: 2.7# 说明: html内容提取器# 功能: 使用xslt作为模板,快速提取HTML DOM中的内容。# released by 集搜客(http://www.gooseeker.com) on May 18, 2016# github: https://github.com/FullerHua/jisou/core/gooseeker_py2.pyfrom urllib2 import urlopenfrom urllib import quotefrom lxml import etreeimport timeclass GsExtractor(object):    def _init_(self):        self.xslt = ""    # 从文件读取xslt    def setXsltFromFile(self , xsltFilePath):        file = open(xsltFilePath , 'r')        try:            self.xslt = file.read()        finally:            file.close()    # 从字符串获得xslt    def setXsltFromMem(self , xsltStr):        self.xslt = xsltStr    # 通过GooSeeker API接口获得xslt    def setXsltFromAPI(self , APIKey , theme, middle=None, bname=None):        apiurl = "http://www.gooseeker.com/api/getextractor?key="+ APIKey +"&theme="+quote(theme)        if (middle):            apiurl = apiurl + "&middle="+quote(middle)        if (bname):            apiurl = apiurl + "&bname="+quote(bname)        apiconn = urlopen(apiurl)        self.xslt = apiconn.read()    # 返回当前xslt    def getXslt(self):        return self.xslt    # 提取方法,入参是一个HTML DOM对象,返回是提取结果    def extract(self , html):        xslt_root = etree.XML(self.xslt)        transform = etree.XSLT(xslt_root)        result_tree = transform(html)        return result_tree

登录后复制

4. 用法示例

下面是一个示例程序,演示怎样使用GsExtractor类提取豆瓣讨论组话题。本示例有如下特征:

提取器的内容通过GooSeeker平台上的api获得

保存结果文件到当前文件夹

下面是源代码,都可从 github 下载

# _*_coding:utf8_*_# douban_py2.py# 爬取豆瓣小组讨论话题# Python版本: 2.7from lxml import etreefrom gooseeker_py2 import GsExtractorfrom selenium import webdriverimport timeclass PhantomSpider:    def getContent(self, url):        browser = webdriver.PhantomJS(executable_path='C:\phantomjs-2.1.1-windows\bin\phantomjs.exe')        browser.get(url)        time.sleep(3)        html = browser.execute_script("return document.documentElement.outerHTML")        output = etree.HTML(html)        return output    def saveContent(self, filepath, content):        file_obj = open(filepath, 'w')        file_obj.write(content)        file_obj.close()doubanExtra = GsExtractor()   # 下面这句调用gooseeker的api来设置xslt抓取规则# 第一个参数是app key,请到GooSeeker会员中心申请# 第二个参数是规则名,是通过GooSeeker的图形化工具: 谋数台MS 来生成的doubanExtra.setXsltFromAPI("ffd5273e213036d812ea298922e2627b" , "豆瓣小组讨论话题")  url = "https://www.douban.com/group/haixiuzu/discussion?start="totalpages = 5doubanSpider = PhantomSpider()print("爬取开始")for pagenumber in range(1 , totalpages):    currenturl = url + str((pagenumber-1)*25)    print("正在爬取", currenturl)    content = doubanSpider.getContent(currenturl)    outputxml = doubanExtra.extract(content)    outputfile = "result" + str(pagenumber) +".xml"    doubanSpider.saveContent(outputfile , str(outputxml))print("爬取结束")

登录后复制

提取结果如下图所示:

QQ图片20161122092324.png

本文已经说明了提取器的价值和用法,但是没有说怎样生成它,只有快速生成提取器才能达到节省开发者时间的目的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2282732.html

(0)
上一篇 2025年2月27日 19:39:16
下一篇 2025年2月27日 19:39:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python 函数 类 语法糖

    Python 语法糖 ,换行连接 s = ”s += ‘a’ +      ‘b’ +      ‘c’n = 1 + 2 + 3# 6 登录后复制 while,for 循环外的 else 如果 while 循环正常结束(没有break退…

    编程技术 2025年2月27日
    200
  • Python即时网络爬虫:API说明

    api说明——下载gsextractor内容提取器 1,接口名称 下载内容提取器 2,接口说明 如果您想编写一个网络爬虫程序,您会发现大部分时间耗费在调测网页内容提取规则上,不讲正则表达式的语法如何怪异,即便使用XPath,您也得逐个编写和…

    编程技术 2025年2月27日
    200
  • Python编程规范

    适当的空行有利于增加代码的可读性,加空行可以参考如下几个准则:     1) 在类、函数的定义间加空行;     2) 在 import 不同种类的模块间加空行;     3) 在函数中的逻辑段落间加空行,即把相关的代码紧凑写在一起,作为一…

    编程技术 2025年2月27日
    200
  • 基于Python实现excel表格读写

    首先安装对应的xlrd和xlwt 打开cmd命令窗口输入pip install xlrd和pip install xlwt就可以安装。之后输入pip list检查是否成功配置: xlrd操作# 接下来就是常用的语法操作:   立即学习“Py…

    2025年2月27日 编程技术
    200
  • Python读取PDF内容

    1,引言 晚上翻看《python网络数据采集》这本书,看到读取pdf内容的代码,想起来前几天集搜客刚刚发布了一个抓取网页pdf内容的抓取规则,这个规则能够把pdf内容当成html来做网页抓取。神奇之处要归功于firefox解析pdf的能力,…

    编程技术 2025年2月27日
    200
  • Python 类与元类的深度挖掘 II

    我们向上回溯一层,看看类对象本身是如何产生的。 我们知道 type() 方法可以查看一个对象的类型,或者说判断这个对象是由那个类产生的: print(type(12))print(type(‘python’)) 登录后复制 登录后复制 cl…

    2025年2月27日
    200
  • Python 中的枚举类型

    枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。python 的原生类型(built-in types)里并没有专门的枚举类型,但是我们可以通过很多方法来实现它,例如字典、类等: WE…

    编程技术 2025年2月27日
    200
  • 理解 Python 中s可变参数的 *args 和 **kwargs

    使用默认参数的可变参数 python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2):   print ‘Required argument: ‘, one   prin…

    编程技术 2025年2月27日
    200
  • python删除文件和删除目录的方法

    下面来看一下python里面是如何删除一个文件及文件夹的~~ 首先引入os模块 import os 删除文件: os.remove() 删除空目录: os.rmdir() 递归删除空目录: os.removedirs() 递归删除目录和文件…

    编程技术 2025年2月27日
    200
  • python3与python2.7的分别

    搜索一下大家就会知道,python有两个主要的版本,python2 和 python3 ,但是python又不同于其他语言,向下兼容,python3是不向下兼容的,但是绝大多数组件和扩展都是基于python2的,下面就来总结一下 pytho…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论