一个简单的开源PHP爬虫框架『Phpfetcher』

2023-05-16

这篇文章首发在吹水小镇:http://blog.reetsee.com/archives/366

要在手机或者电脑看到更好的图片或代码欢迎到博文原地址。也欢迎到博文原地址批评指正。

转载请注明: 吹水小镇 | reetsee.com
原文链接地址: http://blog.reetsee.com/archives/366

——————————————————————————————


好久不见了!我终于又写一篇日志了,本来有很多流水帐想发但是感觉没营养,就作罢了。今天我主要分享一个简单的PHP爬虫框架,名字叫: Phpfetcher 项目的地址是:https://github.com/fanfank/phpfetcher这个框架的作者是:reetsee.xu,即吹水。把整个项目下载下来后,在Linux下的终端直接执行 demo文件夹下的single_page.php即可看到效果。不过在执行demo文件前,先设置一下你的终端编码为UTF-8以免显示乱码:

export LANG=en_US.UTF-8  
————————————————————————————————

0 背景

背景是这样的目前 吹水新闻( http://news.reetsee.com)下的内容全部由Python的爬虫抓取,使用的框架是Python的 Scrapy,而吹水新闻目前是运行在 BAE(百度应用引擎)下的,每个月还需要交钱。目前我的想法是把吹水新闻完全迁移到目前这台阿里云主机上,并且原本的新闻我每天都手动执行一次脚本来抓取再更新到网站,等迁移到这里后就能直接使用Crontab定时脚本自动更新新闻了!最近工作都在用 PHP,开发网站的新页面要PHP,直接读写数据库也能用PHP,那么就直接用PHP重构新闻网站好了。准备开干的时候却发现没找到一个好的PHP爬虫框架(可能是我没仔细找),于是就打算自己写一个,因此就有了这个Phpfetcher。名字起得略好……但是代码写得略搓……不管怎么样,目前基本可以用,而且应该能满足不少简单的需求,下面就是使用示例。

 1 基本概念

在Phpfetcher中有四个主要的对象,依次是:Dom,Page,Crawler,Manager。
  • Dom对象用来解析html,能够访问html里的dom;
  • Page对象对应到一个具体的html页面,能够取得整个网页的内容,Page对象中有一个Dom对象的成员;
  • Crawler对象可以理解为就是爬虫对象,用来设置要爬取页面的规则;
  • Manager对象原本是用来管理Crawler对象的,以后或许能用来在多进程环境下使用,但目前没有实现,所以暂时没有用;
大致概念就是这样了,实际使用主要是操作Crawler对象。在Phpfetcher中,你可以实现自己的Dom,Page和Crawler,只要符合基类的要求即可。要说明的是Phpfetcher的默认Page对象中的Dom对象使用的是 simple_html_dom,没有使用PHP提供的 DOMDocument类,因为我发现DOMDocument对HTML格式的内容兼容性比较差,有时网页中混入其它内容时可能解析不出dom。下面这张是图是Phpfetcher的目录结构: phpfetcher_目录结构 你可以根据自己的需要定制想要的Crawler,Page,Dom类,默认情况下我提供了Crawler的默认类是Phpfetcher_Crawler_Default,Page的默认类是Phpfetcher_Page_Default,Dom的默认类是Phpfetcher_Dom_SimpleHtmlDom。类名和它们所在的路径有对应关系。要注意的是, 在使用默认的Page对象时需要PHP的curl库,使用默认的Crawler对象时需要使用PHP的mb_string库,没有的需要装一下。为了便于理解,我画了几张图,第一张是Phpfetcher的三个主要对象之间的关系: phpfetcher_类结构图里表示的是Crawler里面有Page的对象,Page里面有Dom的对象。在使用Phpfetcher时,最重要的是完成下图中两个绿色矩形框要求的事情: phpfetcher_用户使用即你要写一个类继承Phpfetcher提供的Crawler类,然后在你自己的类中实现一个名为handlePage($page)的函数。其中$page参数是一个Phpfetcher的Page类对象。最后这里给出一个基本的流程图: phpfetcher_工作流程图 上面说的东西有点虚,那还是直接看实例吧! 

2 简单例子

****** 实例1:single_page.php ******例如我们要抓取这个网站的内容: http://news.qq.com/a/20140927/026557.htm里面有很多超链接,有标题,有新闻详细内容,或者其它我们关心的内容。先看一下下面的例子:
<?php
require_once('phpfetcher.php');
class mycrawler extends Phpfetcher_Crawler_Default {
    public function handlePage($page) {
        //打印处当前页面的title
        $res = $page->sel('//title');
        for ($i = 0; $i < count($res); ++$i) {
            echo $res[$i]->plaintext;
            echo "\n";
        }
    }
}

$crawler = new mycrawler();
$arrJobs = array(
    //任务的名字随便起,这里把名字叫qqnews
    //the key is the name of a job, here names it qqnews
    'qqnews' => array( 
        'start_page' => 'http://news.qq.com/a/20140927/026557.htm', //起始网页
        'link_rules' => array(
            /*
             * 所有在这里列出的正则规则,只要能匹配到超链接,那么那条爬虫就会爬到那条超链接
             * Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches
             */
        ),
        //爬虫从开始页面算起,最多爬取的深度,设置为1表示只爬取起始页面
        //Crawler's max following depth, 1 stands for only crawl the start page
        'max_depth' => 1, 
        
    ) ,   
);

//$crawler->setFetchJobs($arrJobs)->run(); 这一行的效果和下面两行的效果一样
$crawler->setFetchJobs($arrJobs);
$crawler->run();
将这个脚本和“phpfetcher.php”以及“Phpfetcher”文件夹放在同一个目录下(或者将“phpfetcher.php”和“Phpfetcher”放到你的PHP环境默认include的查找路径),执行这个脚本,得到的输出如下:

[root@reetsee demo]# php single_page.php 
王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网  
查看一下我们抓取的网页源代码,可以发现是下面这几行中的title标签内容提取出来了:
<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312"></meta>
        <meta charset="gb2312"></meta>
        <title>
            王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网
        </title>
上面就是一个最简单的例子。  ****** 实例2:multi_page.php ******接下来就是另外一个简单的例子,例如说腾讯新闻的主页,上面有各种新闻,我们这次的目标是把腾讯新闻主页( http://news.qq.com)显示的部分新闻标题抓下来,直接先上例程:
<?php
//下面两行使得这个项目被下载下来后本文件能直接运行
$demo_include_path = dirname(__FILE__) . '/../';
set_include_path(get_include_path() . PATH_SEPARATOR . $demo_include_path);

require_once('phpfetcher.php');
class mycrawler extends Phpfetcher_Crawler_Default {
    public function handlePage($page) {
        //打印处当前页面的第1个h1标题内荣(下标从0开始)
        $strFirstH1 = trim($page->sel('//h1', 0)->plaintext);
        if (!empty($strFirstH1)) {
            echo $page->sel('//h1', 0)->plaintext;
            echo "\n";
        }
    }
}

$crawler = new mycrawler();
$arrJobs = array(
    //任务的名字随便起,这里把名字叫qqnews
    //the key is the name of a job, here names it qqnews
    'qqnews' => array( 
        'start_page' => 'http://news.qq.com', //起始网页
        'link_rules' => array(
            /*
             * 所有在这里列出的正则规则,只要能匹配到超链接,那么那条爬虫就会爬到那条超链接
             * Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches
             */
            '#news\.qq\.com/a/\d+/\d+\.htm$#',
        ),
        //爬虫从开始页面算起,最多爬取的深度,设置为2表示爬取深度为1
        //Crawler's max following depth, 1 stands for only crawl the start page
        'max_depth' => 2, 
        
    ) ,   
);

$crawler->setFetchJobs($arrJobs)->run(); //这一行的效果和下面两行的效果一样
//$crawler->setFetchJobs($arrJobs);
//$crawler->run();
相比于第1个例子,变化的地方有几个:首先这次我们增加了一条爬虫跟踪的规则“#news\.qq\.com/a/\d+/\d+\.htm$#”(注:PHP使用pcre正则表达式,可以到 PHP关于正则表达式的页面看一下),这是一个正则表达式,例如这种超链接“news.qq.com/a/12345678/00234.htm”那么爬虫就会跟踪;然后是我们把爬虫的最大跟踪深度设置为2,这样爬虫会跟踪1次起始页面上符合要求的超级链接;最后是我把原本的Dom选择从“//title”改为了“//h1”,意思就是抓取h1标签的内容而不是像之前那样抓取title标签,想知道这种Dom选择器的选择规则,需要了解一下 xpath。运行这个文件,能够看到大致效果如下: phpfetcher_multipage  这样第二个例子就结束了。暂时我就介绍这两个例子吧,Phpfetcher的源代码在这里: https://github.com/fanfank/phpfetcher把代码下载下来后,demo内的东西就可以直接运行了(当然你需要一个有curl和mb_string扩展的php,可以使用“php -m”命令来看一下你的PHP有没有装这两个扩展)。

3 后话

实际上这个phpfetcher目前还有很多问题,性能应该是比较差的,不过毕竟也是我写的第一个框架。另外是关于phpfetcher我有很多东西还没有提到,例如Page对象的一些设置,Crawler对象的设置等,主要是目前太过懒不想写文档,也不知道有没有必要写。我感觉这个框架还是蛮简单的,里面主要的函数我都做了详细的注释,欢迎阅读批评指正给建议!最后就是,如果你想写个爬虫,又想用PHP来写,不妨试一下phpfetcher。 祝大家国庆节快乐~!  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个简单的开源PHP爬虫框架『Phpfetcher』 的相关文章

  • 一个非常适合单片机的滤波算法

    连接 xff1a http bbs 21ic com icview 170880 1 1 html 以下为原文 连接 xff1a http bbs 21ic com icview 170880 1 1 html 单片机大多资源小 xff0c
  • 6.蒙特卡洛方法(TSP)

    定义 xff1a 旅行商问题 xff0c 即TSP问题 xff08 Traveling Salesman Problem xff09 又译为旅行推销员问题 货郎担问题 xff0c 是数学领域中著名问题之一 假设有一个旅行商人要拜访n个城市
  • 云和AI时代下,需要怎样的存储?

    数字化浪潮席卷而来 xff0c 颠覆着传统的生产和生活方式 xff0c 随之产生的新经济和新应用给传统业务模式和产业结构带来前所未有的冲击 特别是云计算 人工智能 AI 和物联网 IoT 的兴起 xff0c 加快了传统产业升级改造的步伐 在
  • 人工智能6个核心技术

    机械学习 机械学习是多领域交叉的学科 xff0c 可以从学习模式和学习方法上面进行分类 xff0c 学习模式将机器学习分类为监督学习 无监督学习和强化学习等 xff0c 学习方法可以将机器学习分为传统机器学习和深度学习 机器学习按学习方式分
  • CAN总线的标准(二)

    一 OSI参考模型 CAN总线标准规定了物理层和数据链路层 xff0c 至于应用层需要用户自定义 不同的CAN标准仅物理层不同 物理层和数据链路层ISO11898 xff1b 应用层 xff1a 不同的应用领域使用不同的应用层标准 二 各层
  • 数据通信--ASCII码通信&16进制通信的区别

    16进制通信一般用于网络传输等的通信上 xff0c 传输效率高 数据量大是二进制通信 ASCII码通信一般用与串口通信等通信上 xff0c 数据量小 易于处理 便于调试 xff0c 它虽然是文本模式 xff0c 但本质仍然是二进制通信 在使
  • ubuntu下安装boost

    boost中 xff0c 用到了别的函数库 xff0c 所以为了使用boost中相应的功能 xff0c 需要先安装系统中可能缺失的库 第一步 安装依赖库 sudo apt get install mpi default dev 安装mpi库
  • 数据结构实验快速排序、冒泡排序算法(交换排序),使用STM32单片机测试(学计算机综合考试408悟单片机系列)

    快速排序和冒泡排序均属于交换排序范畴 xff0c 意味着其基本操作是交换两数 快速排序 xff0c 顾名思义快速的排序 xff0c 毫无遮拦得介绍了自己得特征 而冒泡排序也正如其名称 xff0c 如同养鱼冒泡一样慢条斯理锝排序 xff08
  • 操作系统-13-程序员应如何理解中断

    在这一节中我们聊一聊 xff0c 操作系统管理外设的中断机制 为什么要在这一节聊一聊操作系统如何管理外设呢 xff0c 外设管理是操作系统的核心任务之一 xff0c 理解操作系统的外设管理机制对于我们理解操作系统工作原理至关重要 通过第二章
  • Gitee实现本地代码上传他人的远程仓库

    前言 xff1a 需要下载git bash xff0c 并拥有自己的Gitee账号哦 关于git下载可以看这个博客 xff08 CSDN有很多 xff09 xff1a git git bash 下载与安装 娄笙悦的博客 CSDN博客 Git
  • 关于用elsevier-cas模板的一些问题

    关于用elsevier cas模板的一些问题 关于graphical abstract和highlight 这俩东西可能跟具体的期刊有关 xff0c 在我要投的这个期刊里边 xff0c 这俩是不需要的 xff0c 可以直接从模板中删除 关于
  • 几种供电总线技术

    PowerBus技术 PowerBus为可供电总线技术 xff0c 是业内唯一可以支持大功率负载供电和高速通讯的总线技术 xff0c 相比其他可供电总线技术 xff1a PowerBus供电效率高 xff0c 通过两根电源线最大可提供单个设
  • 使用dd复制将乌班图系统(Ubuntu22.04)完整迁移到新硬盘并扩容

    我的折磨历程 开始的时候用乌班图的时候 xff0c 不懂事 xff0c 根目录太小了 xff0c 后来就满了 xff0c 就就感觉完全没法用 xff0c 看着现在硬盘贼便宜 xff0c 去狗东买了个新的硬盘 感觉挂载硬盘并不能解决我的问题
  • 《剑指offer》面试题 12:矩阵中的路径(C++实现)

    题目 请设计一个函数 xff0c 用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径 路径可以从矩阵中任意一格开始 xff0c 每一步可以在矩阵中向左 右 上 下移动一格 如果一条路径经过了矩阵的某一格 xff0c 那么该路径不能再
  • CocosCreator项目实战(13):功能-排行榜

    文章目录 一 主域设置二 子域设置三 其他相关设置 参考Cocos接入微信小游戏官方文档 xff0c 为了保护其社交关系链数据 xff0c 微信小游戏增加了开放数据域的概念 只有在开放数据域中才能访问微信提供的wx getFriendClo
  • Android MotionLayout 运动布局的使用

    Google 在 2018 年开发者大会上推出一种新的布局组件 MotionLayout 其官方定义如下 xff1a MotionLayout is a layout type that helps you manage motion an
  • Jetpack练手(03):DataBinding

    文章目录 一 导入依赖二 搭建布局三 创建 ViewModel 数据对象四 修改布局为 DataBinding 布局五 绑定数据六 Demo 效果 一 导入依赖 新建 DataBindingDemo 工程 xff0c 参照 LiveData
  • Jetpack练手(04):Lifecycle

    文章目录 一 搭建布局二 非 Lifecycle 实现三 Lifecycle 实现四 Demo 效果 一 搭建布局 新建 LifecycleDemo 工程实现 界面停留时间计时 xff0c 在 activity main xml 搭建简单布
  • OpenDDS学习笔记(4):OpenDDS在Linux环境编译

    文章目录 一 编译前准备1 1 环境1 2 下载ACE 43 TAO与OpenDDS1 3 解压安装ACE 43 TAO与OpenDDS1 4 设置相关环境变量 二 编译2 1 设置config h2 2 设置Platform macros
  • OpenDDS学习笔记(2):DDS概述

    文章目录 一 DDS体系结构1 1 DLRL层1 2 DCPS层 二 DDS通信过程三 DDS通信特点四 DDS标准实现4 1 RTI DDS软件4 2 OpenSplice DDS软件4 3 OpenDDS软件 一 DDS体系结构 DDS

随机推荐

  • OpenDDS学习笔记(3):OpenDDS概述

    文章目录 一 DCPS概述1 1 基本组成1 2 内置主题1 3 QoS策略1 4 Listener1 5 条件 二 OpenDDS实现2 1 兼容性2 1 1 DDS兼容性2 1 2 DDS RTPS兼容性 2 2 OpenDDS架构2
  • FastRTPS学习笔记(2):安装、创建简单应用

    文章目录 一 FastRTPS v1 8 0 安装运行1 1 环境准备1 2 下载FastRTPS v1 8 01 3 编译安装1 4 创建简单应用1 4 1 编写简单程序1 4 2 编译简单程序1 4 3 运行简单示例 二 FastRTP
  • EOF是什么?

    转载自 xff1a http www ruanyifeng com blog 2011 11 eof html 我学习C语言的时候 xff0c 遇到的一个问题就是EOF 它是end of file的缩写 xff0c 表示 34 文字流 34
  • FastRTPS学习笔记(1):RTPS概述

    文章目录 一 RTPS简介二 RTPS优点三 RTPS架构3 1 结构模块3 2 消息模块3 3 行为模块3 4 发现模块 四 参考来源 一 RTPS简介 实时发布订阅协议 xff08 Real Time Publish Subscribe
  • 面试笔记:面经-猿辅导-一面

    文章目录 一 自我介绍二 项目相关三 Java后台3 1 Java异常处理3 1 1 Exception和Error的区别3 1 2 RuntimeException和CheckedException的区别 3 2 Java线程3 2 1
  • TensorFlow安装和下载(超详细)

    TensorFlow是一款开源的机器学习框架 xff0c 可用于构建和训练各种深度学习模型 在下面的回答中 xff0c 我将向您介绍如何在Windows Linux和Mac OS系统上安装和下载TensorFlow Windows系统上安装
  • geometry_msgs::PoseWithCovarianceStamped

    该消息表示带有时间标签和参考坐标的估计位姿 两部分构成 xff1a std msgs Header header geometry msgs PoseWithCovariance pose 1 std msgs Header msg主要由三
  • ubuntu vnc 下面小企鹅输入法 的安装及使用

    使用VNC View远程访问ubuntu xff0c 总是没有办法切换出小企鹅输入法的解决办法 安装Fcitx输入法 sudo apt get install fcitx 安装 im switch s fcitx 配置默认输入法为 fcit
  • java解析html之HTMLparser初次尝试

    为了爬取一个网页的数据 xff0c 尝试了一下Htmlparser来做小爬虫 下面是一个小案例 xff0c 用来爬取论坛的帖子内容 1 HtmlParser 简介 htmlparser是一个纯的java写的html解析的库 xff0c 主要
  • px4自定义mavlink收不到消息的问题

    px4版本1 12稳定版 最近在做px4二次开发相关工作 按照网上的一些教程自定义了一个mavlink消息用来控制无人机 按照教程里面的单独开了一个xml来定义消息 最后生成的消息在px4端通过流传输的方式自己写的客户端可以收到消息 但是客
  • windows WSL2 使用Xfce+dummy虚拟显示+VNC显示方案

    最近准备在自己的电脑 windows 下用wsl2装docker 然后将显卡共享给别人用 别骂了别骂了太穷啦太穷了 发现windows微软商店下载的ubuntu20 04子系统没有预装图形界面 想在wsl里面显示东西不好使用 摸索了一番 x
  • 有趣的docker镜像收藏

    docker一键安装脚本 wget qO get docker com sh 官方安装 curl sSL https get daocloud io docker sh 国内daodocker安装 推荐 镜像1 xff1a rastashe
  • vc 网络编程(socket)

    vc 网络编程 xff08 socket xff09 在网上找了很多的资料 xff0c 现将这些资料整合起来 xff0c 详细介绍一下VC下的socket编程 xff0c 并提供一个服务器客户端具体的实例 希望对您有所帮助 一 原理部分 个
  • ROS创建工作空间与功能包

    ROS学习笔记 学习古月居ros21讲笔记 第一章 ROS命令行工具的使用 第二章 创建工作空间与功能包 目录 ROS学习笔记 一 工作空间 二 功能包 一 工作空间 工作空间是存放ROS工程相关文件的文件夹 所有的源码 xff0c 编译文
  • C++类、结构对象内存布局浅析

    最近面试多 xff0c 出的题目很多都有如下形式 xff0c 给定一个class或者struct的定义 xff0c 例如这样 xff1a struct node int a char b int c char d 问题是 xff1a siz
  • 2014校园招聘总结

    本篇博文已迁移至吹水小镇reetsee com xff0c 迁移后地址为 xff1a http blog reetsee com archives 215 注 xff1a 貌似不少童鞋看到这篇东西觉得我是牛人 其实不是stO xff0c 以
  • 今天终于刷完leetcode的题了,同时分享一些资料

    如题了 持续了将近2个月的leetcode刷题之旅今天终于暂时告一段落了 xff08 以后肯定还会加题 xff09 记得我当初刷的时候只有134题 xff0c 现在就变成150题了 xff0c 可以说这些题都是基础 xff0c 但是却是十分
  • 路由器连接校园网并发WIFI:WR703N路由器安装OpenWRT并运行H3C客户端操作步骤(主要针对中山大学东校区)

    注意 xff1a 本文所有的最新更正请全部前往http blog reetsee com archives 227查看 本文主要目的在于让你的路由器能自动连接学校的校园网并且能发出WIFI让所有设备使用 要注意的是这篇作者呕心沥血写的超级傻
  • 教程:用OpenWRT进行WIFI接力——扩大WIFI覆盖范围

    因为准备去实习 xff0c 所以把宿舍很多东西都带回家了 xff0c 包括一个装了OpenWRT的路由器WR703N Step 0 为什么要这么做 在家里有一个地方不爽 xff0c 就是WIFI的信号覆盖不到我的房间 xff0c 所以我就想
  • 一个简单的开源PHP爬虫框架『Phpfetcher』

    这篇文章首发在吹水小镇 xff1a http blog reetsee com archives 366 要在手机或者电脑看到更好的图片或代码欢迎到博文原地址 也欢迎到博文原地址批评指正 转载请注明 xff1a 吹水小镇 reetsee c