zoukankan      html  css  js  c++  java
  • phpspider 的简单使用

    phpspider 的简单使用

    • phpspider是一款PHP开发蜘蛛爬虫框架。

      官方github下载地址:https://github.com/owner888/phpspider 
      官方文档下载地址:https://doc.phpspider.org/ 
      由于官方文档可能会出现打不开的情况(我一开始试了很多次都打不开),这里提供一个网盘下载地址:链接:https://pan.baidu.com/s/1LfJOCw1rthN_luotF7iUDw 密码:cylb

    • 使用 
      代码下载下来后里面有几个例子,我这里就以代码中糗事百科为例,主要介绍几点注意事项。 
      1、代码必须放到命令行运行,可以使用 php -f 语句。 
      2、在代码中的例子糗事百科抓取网址写的是 http,运行不成功,要改成 https。 
      3、save_running_state 参数表示是否保存爬虫运行状态,如果选择了true,则会使用到redis。 
      4、抓取时默认使用的 selector 是 xpath,如果想使用其它的可以用 selector_type 参数修改,文档中介绍目前可用 xpath, jsonpath, regex,但是我看使用 css 也是可以的。 
      5、写 selector 时可以打开要抓取的页面,审查元素,选择要抓取的数据,右击->copy,选择 copy selector 或 copy xpath ,可以直接得到该元素的 selector。(这点在开发文档上也有相应的介绍)。 
      6、抓取的数据存储可以有三种选择,.csv 文件,.sql 文件,也可以直接插入数据库表中,选择相应的表名即可(要字段对应)。

    下面贴上我修改后的代码:

    <?php
    // composer下载方式
    // 先使用composer命令下载:
    // composer require owner888/phpspider
    // 引入加载器
    //require './vendor/autoload.php';
    
    // GitHub下载方式
    require_once __DIR__ . '/../autoloader.php';
    use phpspidercorephpspider;
    
    /* Do NOT delete this comment */
    /* 不要删除这段注释 */
    
    $configs = array(
        'name' => '糗事百科',
        'log_show' => true,
        'tasknum' => 1,
        'save_running_state' => false,
        'domains' => array(
            'qiushibaike.com',
            'www.qiushibaike.com'
        ),
        'scan_urls' => array(
            'https://www.qiushibaike.com/'
        ),
        'list_url_regexes' => array(
            "https://www.qiushibaike.com/8hr/page/d+?s=d+"
        ),
        'content_url_regexes' => array(
            "https://www.qiushibaike.com/article/d+",
        ),
        'max_try' => 5,
        //'proxies' => array(
            //'http://H784U84R444YABQD:57A8B0B743F9B4D2@proxy.abuyun.com:9010'
        //),
        //'export' => array(
            //'type' => 'csv',
            //'file' => '../data/qiushibaike.csv',
        //),
        //'export' => array(
            //'type'  => 'sql',
            //'file'  => '../data/qiushibaike.sql',
            //'table' => 'content',
        //),
        'export' => array(
            'type' => 'db',
            'table' => 'content',
        ),
        'db_config' => array(
            'host'  => '127.0.0.1',
            'port'  => 3306,
            'user'  => 'root',
            'pass'  => 'root',
            'name'  => 'test',
        ),
    //    'queue_config' => array(
    //        'host'      => '127.0.0.1',
    //        'port'      => 6379,
    //        'pass'      => 'foobared',
    //        'db'        => 5,
    //        'prefix'    => 'phpspider',
    //        'timeout'   => 30,
    //    ),
        'fields' => array(
            array(
                'name' => "article_title",
                'selector' => "//*[@id='single-next-link']//div[contains(@class,'content')]/text()[1]",
                'required' => true,
            ),
            array(
                'name' => "article_author",
                'selector' => "//div[contains(@class,'author')]//h2",
                'required' => true,
            ),
            array(
                'name' => "article_headimg",
                'selector' => "//div[contains(@class,'author')]//a[1]",
                'required' => true,
            ),
            array(
                'name' => "article_content",
                'selector' => "//*[@id='single-next-link']//div[contains(@class,'content')]",
                'required' => true,
            ),
            array(
                'name' => "article_publish_time",
                'selector' => "//div[contains(@class,'author')]//h2",
                'required' => true,
            ),
            array(
                'name' => "url",
                'selector' => "//div[contains(@class,'author')]//h2",   // 这里随便设置,on_extract_field回调里面会替换
                'required' => true,
            ),
        ),
    );
    
    $spider = new phpspider($configs);
    
    $spider->on_handle_img = function($fieldname, $img) 
    {
        $regex = '/src="(https?://.*?)"/i';
        preg_match($regex, $img, $rs);
        if (!$rs) 
        {
            return $img;
        }
    
        $url = $rs[1];
        $img = $url;
    
        //$pathinfo = pathinfo($url);
        //$fileext = $pathinfo['extension'];
        //if (strtolower($fileext) == 'jpeg') 
        //{
            //$fileext = 'jpg';
        //}
        //// 以纳秒为单位生成随机数
        //$filename = uniqid().".".$fileext;
        //// 在data目录下生成图片
        //$filepath = PATH_ROOT."/images/{$filename}";
        //// 用系统自带的下载器wget下载
        //exec("wget -q {$url} -O {$filepath}");
    
        //// 替换成真是图片url
        //$img = str_replace($url, $filename, $img);
        return $img;
    };
    
    $spider->on_extract_field = function($fieldname, $data, $page) 
    {
        if ($fieldname == 'article_title') 
        {
    //        if (strlen($data) > 10)
    //        {
    //            // 下面方法截取中文会有异常
    //            //$data = substr($data, 0, 10)."...";
    //            $data = mb_substr($data, 0, 10, 'UTF-8')."...";
    //            $data = trim($data);
    //        }
        }
        elseif ($fieldname == 'article_publish_time') 
        {
            // 用当前采集时间戳作为发布时间
            $data = time();
        }
        // 把当前内容页URL替换上面的field
        elseif ($fieldname == 'url') 
        {
            $data = $page['url'];
        }
        return $data;
    };
    
    $spider->start();
    

      

    注意一点,on_handle_img,on_extract_field两个方法抓取其它项目时不一定适用,要改成自己的逻辑处理。

    • 运行

    至此一个简单的抓取数据程序就完成了。

  • 相关阅读:
    python 的基础 学习 第六天 基础数据类型的操作方法 字典
    python 的基础 学习 第五天 基础数据类型的操作方法
    python 的基础 学习 第四天 基础数据类型
    ASP.NET MVC 入门8、ModelState与数据验证
    ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    ASP.NET MVC 入门6、TempData
    ASP.NET MVC 入门5、View与ViewData
    ASP.NET MVC 入门4、Controller与Action
    ASP.NET MVC 入门3、Routing
    ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  • 原文地址:https://www.cnblogs.com/woods1815/p/9613774.html
Copyright © 2011-2022 走看看