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遍历文件夹并删除特定格式文件的示例
Mar 05 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
Apr 10 Python
Python基于最小二乘法实现曲线拟合示例
Jun 14 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
Python装饰器用法与知识点小结
Mar 09 Python
python手机号前7位归属地爬虫代码实例
Mar 31 Python
pandas数据拼接的实现示例
Apr 16 Python
Python检测端口IP字符串是否合法
Jun 05 Python
Python Request类源码实现方法及原理解析
Aug 17 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 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字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python 多个参数不为空校验方法
2019/02/14 Python
Python实现FLV视频拼接功能
2020/01/21 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
植物选择:Botanic Choice
2017/02/15 全球购物
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
精彩广告词大全
2014/03/19 职场文书
调查研究项目计划书
2014/04/29 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript