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类型强制转换long to int的代码
Feb 10 Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
Python实现求解一元二次方程的方法示例
Jun 20 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 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调用mysql数据 dbclass类
2011/05/07 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
php变量范围介绍
2012/10/15 PHP
php遍历目录方法小结
2015/03/10 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
详解.vue文件解析的实现
2018/06/11 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
python自定义异常实例详解
2017/07/11 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
python aiohttp的使用详解
2019/06/20 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
Python 如何查找特定类型文件
2020/08/17 Python
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
初中生期末考试的自我评价
2013/12/17 职场文书
物流管理专业毕业生自荐信
2014/03/04 职场文书
初一学生评语大全
2014/04/24 职场文书
单位接收函范文
2015/01/30 职场文书
同事欢送会致辞
2015/07/31 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS