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使用any判断一个对象是否为空的方法
Nov 19 Python
在Python中使用模块的教程
Apr 27 Python
python基础教程之五种数据类型详解
Jan 12 Python
用python处理图片实现图像中的像素访问
May 04 Python
浅谈django rest jwt vue 跨域问题
Oct 26 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
使用Bazel编译TensorBoard教程
Feb 15 Python
Python 多线程共享变量的实现示例
Apr 17 Python
pycharm 激活码及使用方式的详细教程
May 12 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
python selenium xpath定位操作
Sep 01 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
用PHP函数解决SQL injection
2006/12/09 PHP
PHP 模板高级篇总结
2006/12/21 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
有关PHP中MVC的开发经验分享
2012/05/17 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
jquery 简单导航实现代码
2009/09/11 Javascript
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
python实现下载整个ftp目录的方法
2017/01/17 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
python机器学习之随机森林(七)
2018/03/26 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
德国网上宠物店:Zoobio
2018/05/23 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
销售自我评价
2013/10/22 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
学会感恩主题班会
2015/08/12 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript