一个简单的开源PHP爬虫框架『Phpfetcher』
这篇文章首发在吹水小镇:http://blog.reetsee.com/archives/366
要在手机或者电脑看到更好的图片或代码欢迎到博文原地址。也欢迎到博文原地址批评指正。
??????????????????????????????
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。2 简单例子
****** 实例1:single_page.php ******例如我们要抓取这个网站的内容: http://news.qq.com/a/20140927/026557.htm里面有很多超链接,有标题,有新闻详细内容,或者其它我们关心的内容。先看一下下面的例子:<?phprequire_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();
[root@reetsee demo]# php single_page.php 王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网
<!DOCTYPE html><html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"></meta> <meta charset="gb2312"></meta> <title> 王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网 </title>
<?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();
3 后话
实际上这个phpfetcher目前还有很多问题,性能应该是比较差的,不过毕竟也是我写的第一个框架。另外是关于phpfetcher我有很多东西还没有提到,例如Page对象的一些设置,Crawler对象的设置等,主要是目前太过懒不想写文档,也不知道有没有必要写。我感觉这个框架还是蛮简单的,里面主要的函数我都做了详细的注释,欢迎阅读批评指正给建议!最后就是,如果你想写个爬虫,又想用PHP来写,不妨试一下phpfetcher。 祝大家国庆节快乐~!
Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Alipay PHP...

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

The application of SOLID principle in PHP development includes: 1. Single responsibility principle (SRP): Each class is responsible for only one function. 2. Open and close principle (OCP): Changes are achieved through extension rather than modification. 3. Lisch's Substitution Principle (LSP): Subclasses can replace base classes without affecting program accuracy. 4. Interface isolation principle (ISP): Use fine-grained interfaces to avoid dependencies and unused methods. 5. Dependency inversion principle (DIP): High and low-level modules rely on abstraction and are implemented through dependency injection.

How to automatically set the permissions of unixsocket after the system restarts. Every time the system restarts, we need to execute the following command to modify the permissions of unixsocket: sudo...

How to debug CLI mode in PHPStorm? When developing with PHPStorm, sometimes we need to debug PHP in command line interface (CLI) mode...

Sending JSON data using PHP's cURL library In PHP development, it is often necessary to interact with external APIs. One of the common ways is to use cURL library to send POST�...

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

Article discusses late static binding (LSB) in PHP, introduced in PHP 5.3, allowing runtime resolution of static method calls for more flexible inheritance.Main issue: LSB vs. traditional polymorphism; LSB's practical applications and potential perfo
