Composer 白话版介绍 + 简单 PHP 爬虫

Composer 是一个命令行工具,主要用于管理依赖

通俗的讲解一下它吧,以做实验为例。

在做实验之前,需要准备很多材料和仪器:比如烧杯1个,温度计1支,酒精灯1盏,火柴1盒,清水500ml,高锰酸钾100g,支架1只,液态氢气100g。

在做实验的时候,书上会列出这些清单,我们只需要找实验管理员要这些东西就可以了。需要关心酒精灯里需要加满酒精,需要关心高锰酸钾是过期的吗?不需要。只需要一个清单,万事俱备,去动手做实验就好了。

如果没有实验室管理员,情况会怎样?你会去超市买烧杯、火柴,药店买温度计,酒精灯,高锰酸钾,卖五金的地方买支架等等。假设氢气买不到,你还要自己制氢气。

(为了举这个例子,我还去搜索了高锰酸钾制氧气 LOL )

Composer = 实验室管理员

你可以把 Composer,当成实验室管理员, 给个清单就能给你需要的一切。这个清单,就是 composer.json 文件

别的学校的同学要做同样的实验,给个清单给他就好了。不需要把这一堆实验器材快递给TA(快递其实是可以的,如果包邮的话)

传递仪器清单与快递实验仪器相比,前者是不是容易多了,一个清单,一条QQ消息就发过去了。

回到真实的例子

我需要用 php 写一个叫 jungle 的命令行工具,来抓取一个网站,即所谓的爬虫。

首先,我要模拟人通过浏览器访问网站。即输入是一个网址,输出是一堆 HTML 代码。

这个事情,已经有现成的代码可以做了。我认为我需要把它加入清单。它就是 Guzzle,composer 管它叫 guzzlehttp/guzzle。我怎么知道的,其实我不知道,“实验室管理员”告诉我的,“实验室管理员”怎么知道的,这个网站 https://packagist.org 告诉TA的。

拿到这个 HTML 文件,我希望轻松的获取其中的内容,像 jQuery 一样。比如获取这个页面中所有图片的地址:$("img").map(function(){console.log($(this).attr("src"))}) (代码看起来不少,不轻松,其实很简单,原谅我举了一个不合适的例子)。 这时,我还会偷懒,去找现成的代码。对,想起了,symfony/dom-crawler,就是它!!!它可以让我像写 jQuery 一样,获取页面中的图片地址。其实我刚刚撒谎了,要像 jQuery 一样写,其实还需要 symfony/dom-crawler 和 symfony/css-selector 搭配使用。

好了这就是我的清单:

  • guzzlehttp/guzzle
  • symfony/dom-crawler
  • symfony/css-selector

以下是“实验室管理员”时间,composer 一阵运行:

创建一个文件夹,创建文件夹干嘛,用于放这些“实验器材”。

mkdir jungle

初始化这个文件夹,可以放“实验器材”,(这一步是交互式生成 composer.json 文件,如果遇到问题,可以拷贝后面提供的 composer.json 文件)

composer init

放入 guzzlehttp/guzzle (可能很慢,需要设置 composer 的镜像代理,运行时我一般会加上 -vvv 输出更多信息。)

composer require guzzlehttp/guzzle

放入 symfony/dom-crawler

composer require symfony/dom-crawler

放入 symfony/css-selector

composer require symfony/css-selector

实验室管理员:来把 jungle 这个文件夹拿去用,你要的所有实验器材都准备好了。

好吧,我们看下文件夹下都有什么

  • composer.json
  • composer.lock
  • vendor/

看到了吗,清单,清单,清单,composer.json,就是它!找到我们的“那三位”了吗

{
    "name": "jungle/jungle",
    "authors": [
        {
            "name": "Qiangjun Ran",
            "email": "jungle@ranqiangjun.com"
        }
    ],
    "require": {
        "guzzlehttp/guzzle": "^6.2",
        "symfony/dom-crawler": "^3.1",
        "symfony/css-selector": "^3.1"
    }
}

好吧,“实验时间”到!创建一个文件 jungle.php

<?php

require __DIR__.'/vendor/autoload.php';

use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;

$url = "http://ranqiangjun.com";
$client = new Client();
$response = $client->request('GET', $url);
$html = (string) $response->getBody();
$crawler = new Crawler($html);
$img_urls = $crawler->filter('img')->extract(array('src'));

foreach ($img_urls as $img_url) {
  echo $img_url . PHP_EOL;
}

运行这个"爬虫"

php jungle.php

你会看到一堆图片地址的输出(有可能是相对路径哦!),然后,复制粘贴这些图片地址吧。迅雷批量下载?好吧,喜欢 Linux,Mac 的可以试下 wget

wget -i file_name_urls

DONE. (所有代码见本文附件)

更多,比如自动加载等,请访问 composer 官网,查看文档。

附件 大小
jungle.zip 359.98 KB

评论

Nice work!