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编写简单网络爬虫抓取视频下载资源
Nov 04 Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
python实时分析日志的一个小脚本分享
May 07 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
pow在python中的含义及用法
Jul 11 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
python中resample函数实现重采样和降采样代码
Feb 25 Python
keras中的卷积层&池化层的用法
May 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
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
JavaScript 验证浏览器是否支持javascript的方法小结
2009/05/17 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
Python的Django框架中的表单处理示例
2015/07/17 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
用python实现刷点击率的示例代码
2019/02/21 Python
Python常用特殊方法实例总结
2019/03/22 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
Linux Interview Questions For software testers
2013/05/17 面试题
前处理组长岗位职责
2014/03/01 职场文书
社区党建工作方案
2014/06/10 职场文书
群教个人对照检查材料
2014/08/20 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
详细介绍python操作RabbitMq
2022/04/12 Python