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连接mysql调用存储过程示例
Mar 05 Python
Python functools模块学习总结
May 09 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
详解Python核心对象类型字符串
Feb 11 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
Python命名空间的本质和加载顺序
Dec 17 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
Mar 01 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
Python yield生成器和return对比代码实例
Apr 20 Python
详解Python 函数参数的拆解
Sep 02 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
python利用文件时间批量重命名照片和视频
Feb 09 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
提问的智慧(2)
2006/10/09 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
基于php 随机数的深入理解
2013/06/05 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
js或css实现滚动广告的几种方案
2010/01/28 Javascript
精通Javascript系列之数值计算
2011/06/07 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
python处理html转义字符的方法详解
2016/07/01 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
名词解释型面试题(主要是网络)
2013/12/27 面试题
董事长助理岗位职责
2014/02/18 职场文书
市场部岗位职责
2015/02/12 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
通知函格式范文
2015/04/27 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
企业团队精神心得体会
2016/01/19 职场文书
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android
muduo TcpServer模块源码分析
2022/04/26 Redis