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


Posted in Python onOctober 25, 2016

1. 项目背景

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

2. 解决方案

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

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

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

  1. 标准化的输入:以标准的HTML DOM对象为输入
  2. 标准化的内容提取:使用标准的xslt模板提取网页内容
  3. 标准化的输出:以标准的XML格式输出从网页上提取到的内容
  4. 明确的提取器插拔接口:提取器是一个明确定义的类,通过类方法与爬虫引擎模块交互

3. 提取器代码

可插拔提取器是即时网络爬虫项目的核心组件,定义成一个类: gsExtractor

python源代码文件及其说明文档请从 github 下载

使用模式是这样的:

  1. 实例化一个gsExtractor对象
  2. 为这个对象设定xslt提取器,相当于把这个对象配置好(使用三类setXXX()方法)
  3. 把html dom输入给它,就能获得xml输出(使用extract()方法)

下面是这个gsExtractor类的源代码

#!/usr/bin/python
# -*- coding: utf-8 -*-
# 模块名: gooseeker
# 类名: gsExtractor
# Version: 2.0
# 说明: html内容提取器
# 功能: 使用xslt作为模板,快速提取HTML DOM中的内容。
# released by 集搜客(http://www.gooseeker.com) on May 18, 2016
# github: https://github.com/FullerHua/jisou/core/gooseeker.py

from urllib import request
from urllib.parse import quote
from lxml import etree
import time

class gsExtractor(object):
  def _init_(self):
    self.xslt = ""
  # 从文件读取xslt
  def setXsltFromFile(self , xsltFilePath):
    file = open(xsltFilePath , 'r' , encoding='UTF-8')
    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 = request.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官网的bbs帖子列表。本示例有如下特征

  1. 提取器所用的xslt模板提前放在文件中:xslt_bbs.xml
  2. 仅作为示例,实际使用场景中,xslt来源有多个,最主流的来源是GooSeeker平台上的api
  3. 在控制台界面上打印出提取结果

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

#-*_coding:utf8-*-
# 使用gsExtractor类的示例程序
# 访问集搜客论坛,以xslt为模板提取论坛内容
# xslt保存在xslt_bbs.xml中
from urllib import request
from lxml import etree
from gooseeker import gsExtractor

# 访问并读取网页内容
url = "http://www.gooseeker.com/cn/forum/7"
conn = request.urlopen(url)
doc = etree.HTML(conn.read())

# 生成xsltExtractor对象
bbsExtra = gsExtractor()
# 调用set方法设置xslt内容
bbsExtra.setXsltFromFile("xslt_bbs.xml")
# 调用extract方法提取所需内容
result = bbsExtra.extract(doc)
# 显示提取结果
print(str(result))

提取结果如下图所示:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈Python程序与C++程序的联合使用
Apr 07 Python
python删除过期文件的方法
May 29 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
Python操作MySQL数据库的方法
Jun 20 Python
python 通过类中一个方法获取另一个方法变量的实例
Jan 22 Python
Tensorflow实现在训练好的模型上进行测试
Jan 20 Python
Python调用jar包方法实现过程解析
Aug 11 Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 07 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 Python
总结三种用 Python 作为小程序后端的方式
May 02 Python
Python实现ssh批量登录并执行命令
Oct 25 #Python
详解Python的Lambda函数与排序
Oct 25 #Python
Python脚本实现Web漏洞扫描工具
Oct 25 #Python
python+django快速实现文件上传
Oct 24 #Python
python实现简单爬虫功能的示例
Oct 24 #Python
简单谈谈Python中的反转字符串问题
Oct 24 #Python
Python 内置函数complex详解
Oct 23 #Python
You might like
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
PHP数组函数知识汇总
2016/05/12 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
php格式化时间戳
2016/12/17 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
JS面向对象编程之对象使用分析
2010/08/19 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
python django集成cas验证系统
2014/07/14 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
python随机模块random使用方法详解
2020/02/14 Python
python爬虫实现获取下一页代码
2020/03/13 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
python利用线程实现多任务
2020/09/18 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
学校地质灾害防治方案
2014/06/10 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
公积金接收函格式
2015/01/30 职场文书
与死神共舞观后感
2015/06/15 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
浅析Python实现DFA算法
2021/06/26 Python