分类 PHP 下的文章

PHP自动加载配置


<?php

namespace App\Util;

use ArrayAccess;

class Config implements ArrayAccess
{
    protected $path;

    protected $config = [];

    public function __construct($path)
    {
        $this->path = $path;
    }

    public function offsetExists($key)
    {
        return isset($this->config[$key]);
    }

    public function offsetGet($key)
    {
        if (! isset($this->config[$key])) {
            $file = $this->path.'/'.$key.'.php';

            $this->config[$key] = file_exists($file) ? require $file : null;
        }

        return $this->config[$key];
    }

    public function offsetSet($key, $value)
    {
        $this->config[$key] = $value;
    }

    public function offsetUnset($key)
    {
        unset($this->config[$key]);
    }
}

简单工厂模式遵循开放封闭原则


<?php

class Factory
{
    protected $items;

    public function __construct(array $items = [])
    {
        $this->items = $items;
    }

    public function register($key, $value = null)
    {
        if (is_array($key)) {
            foreach ($key as $alias => $class) {
                $this->register($alias, $class);
            }
        } else {
            $this->items[$key] = $value;
        }

    }

    public function create($key)
    {
        if (array_key_exists($key, $this->items)) {
            return new $this->items[$key];
        }

        throw new InvalidArgumentException("Key [{$key}] is not registered.");
    }
}

// Test

$factory = new Factory;

$factory->register('std', StdClass::class);
$factory->register('dom', DOMDocument::class);
$factory->register('exception', Exception::class);

$classes = [
    'time' => DateTime::class,
    'queue' => SplQueue::class,
    'array' => ArrayObject::class,
];

$factory->register($classes);

var_dump(
    $factory->create('dom'),
    $factory->create('queue'),
    $factory->create('exception')
);

php实现简易网络爬虫

因为最近项目一直用到定向抓取各大网站的爬虫技术,加上自己对爬虫还算是比较熟悉,所以博客的第一篇就献给网络爬虫吧,内容主要是使用php来实现获取给定百科词条的所有相关词条的标题和简介。

由于只是展示爬虫的基本工作原理和实现过程,所以程序会设计得比较简单,只能称为一个简易爬虫。

爬虫简介

网络爬虫,也叫网页蜘蛛,网络机器人,是指能按照一定规则自动抓取互联网上的信息资源的程序。如果把互联网上的网页看作是一个一个的节点,把网页之间的超链接看作是节点的边,整个互联网就形成了一个Web有向图。

宽度优先遍历 深度优先遍历

爬虫的抓取就是对Web有向图的遍历,按照遍历顺序的不同,可以分为宽度优先(Breadth First)和深度优先(Depth First)两种遍历方式。

网络爬虫最主要的作用就是获取互联网上的数据和信息,广泛应用于搜索引擎、数据挖掘、信息采集、舆情监测等领域,还是广大站长和SEOer获取网站内容和数据的利器。

工作原理

网络爬虫架构

如图所示,首先选取一部分url作为种子url加入待抓取队列中,爬虫会依次读取待抓取队列中的url,并交给下载器将网页下载到本地,html解析器从网页中抽取所有链接,过滤出我们需要的链接。

为了避免爬虫对网页的重复抓取,需要维护一个已抓取集合,用来判断一个url是否已经被抓取过,过滤出的url经过去重后,加入到待抓取队列中,已抓取过的url加入到已抓取集合中,调度程序继续从待抓取队列中取出url进行抓取,如此循环,直到待抓取队列为空。

阅读剩余部分