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 相关文章推荐
zookeeper python接口实例详解
Jan 18 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
使用python客户端访问impala的操作方式
Mar 28 Python
基于Python测试程序是否有错误
May 16 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 Python
python xlwt模块的使用解析
Apr 13 Python
python 如何在list中找Topk的数值和索引
May 20 Python
浅谈Python数学建模之线性规划
Jun 23 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+jQuery实现动态展示信息
2011/10/08 PHP
10条php编程小技巧
2015/07/07 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
JavaScript Cookie的读取和写入函数
2009/12/08 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
小程序转发探索示例
2019/02/19 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
Python实现判断一行代码是否为注释的方法
2018/05/23 Python
python中几种自动微分库解析
2019/08/29 Python
python已协程方式处理任务实现过程
2019/12/27 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
高级Java程序员面试要点
2013/08/02 面试题
预防艾滋病宣传标语
2014/06/25 职场文书
酒会邀请函
2015/01/31 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技