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两个方法抓取其它项目时不一定适用,要改成自己的逻辑处理。

    • 运行

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

  • 相关阅读:
    (原创)如何利用UDP协议封装一个数据包
    <acarousel> 轮播图片无法触屏滑动
    Groovy开发语言
    关于ViewStub标签
    关键字transient和Volatile
    Android中Activity启动模式
    Android 开源项目分类汇总
    AtomicInteger的并发处理
    Cygwin: died waiting for dll loading (转载)
    Android知识点(C2DM)
  • 原文地址:https://www.cnblogs.com/woods1815/p/9613774.html
Copyright © 2011-2022 走看看