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基础教程之匿名函数lambda
Jan 17 Python
Python实现定时任务
Feb 08 Python
Python实现的双色球生成功能示例
Dec 18 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
python3第三方爬虫库BeautifulSoup4安装教程
Jun 19 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
python防止随意修改类属性的实现方法
Aug 21 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
Python while true实现爬虫定时任务
Jun 08 Python
python在地图上画比例的实例详解
Nov 13 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 Python
python 破解加密zip文件的密码
Apr 22 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
NOT NULL 和NULL
2007/01/15 PHP
PHP微信红包API接口
2015/12/05 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
Python抽象类的新写法
2015/06/18 Python
python操作 hbase 数据的方法
2016/12/18 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
Python Cookie 读取和保存方法
2018/12/28 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
招商经理岗位职责
2013/11/16 职场文书
入党申请人的自我鉴定
2013/12/01 职场文书
考试作弊被抓检讨书
2014/01/10 职场文书
销售简历自我评价
2014/01/24 职场文书
运动会入场解说词300字
2014/01/25 职场文书
销售人才自我评价范文
2014/09/27 职场文书
湘江北去观后感
2015/06/15 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
Redis 异步机制
2022/05/15 Redis
Redis批量生成数据的实现
2022/06/05 Redis