美文网首页编程语言-PHP
使用phpspider爬取电子书

使用phpspider爬取电子书

作者: 月圆星繁 | 来源:发表于2019-12-08 23:12 被阅读0次

    PHP是世界上最好的语音

    技术无罪,demo仅仅功学习和交流,如有侵权,请联系我删除。

    phpspider框架框架的开发者写了一篇文章《我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言 》,之前一直想去用一用,但是耽搁了很长时间,周末发了点时间去使用它,并成功爬取了4000多条数据,基本上爬取了那个网站上面所有的内容了吧。

    下载phpspider框架,看看里面的demo,对照这个开发文档,就可以开始上手写了,我觉得还是可以的吧。针对不同的网站稍微要注意的是要爬取的网站是否需要登录验证,手册也有说明,还有就是是否有数据提交这样的,举一反三都是一样的,需要看看请求。

    在一个就是XPath吧,需要定位获取数据,如果不熟悉可以搜索下使用,然后写个运行前的测试一步一步的调试就可以了。

    我爬取的是一个刚建不到一年的站,都是电子书。代码写的不是很规范,本来时求快想看看有多少本电子书,后面有觉得没有什么大用,都是百度云盘的,如果我要这些书,还得一个一个的获取好麻烦的。

    我写的例子:

    <?php
    /**
     * Created by PhpStorm.
     * User: admin
     * Date: 2019/12/08
     * Time: 9:20
     */
    
    ini_set("memory_limit", "10240M");
    require_once __DIR__ . '/../autoloader.php';
    use phpspider\core\phpspider;
    use phpspider\core\requests;
    use phpspider\core\selector;
    use phpspider\core\db;
    
    /* Do NOT delete this comment */
    /* 不要删除这段注释 */
    
    
    header("Content-Type:text/html;charset='utf-8'");
    
        /*模拟提交数据之后显示提取码*/
        // 登录请求url
        $url = "https://www.nmod.net/book/10024.html";
        // 提交的参数
        $params = array(
            "huoduan_verifycode" => "255698"
        );
        // 发送登录请求
        requests::post($url, $params);
    
        $configs = array(
        'name' => 'NMOD电子书',
        //'tasknum' => 8,
        'log_show' => true,
        'save_running_state' => false,
        'domains' => array(
            'www.nmod.net'
        ),
        //
        'scan_urls' => array(
            "https://www.nmod.net",
        ),
        'list_url_regexes' => array(
            "https://www.nmod.net/page/\d+",
        ),
        'content_url_regexes' => array(
            "https://www.nmod.net/book/\d+.html",
        ),
        'export' => array(
            'type' => 'db',
            'table' => 'list',
        ),
        'db_config' => array(
            'host'  => '127.0.0.1',
            'port'  => 3306,
            'user'  => 'root',
            'pass'  => 'root',
            'name'  => 'nmod',
        ),
        'fields' => array(
            // 链接 👍
            array(
                'name' => "link",
                'selector' => "//h1[contains(@class,'article-title')]/a[1]/@href",
                'required' => true,
            ),
            //  书名 👍
            array(
                'name' => "name", 
                'selector' => "//img[contains(@class,'alignleft')]/@title",
                'required' => true,
            ),
            //作者 alert-success 👍
            array(
                'name' => "author",
                'selector' => "//div[contains(@class,'alert-success')]/p[3]",
                'required' => true,
            ),
            //格式 👍
            array(
                'name' => "format",
                'selector' => "//div[contains(@class,'alert-success')]/p[4]",
                'required' => true,
            ),
            //标签 👍
            array(
                'name' => "tag",
                'selector' => "//div[contains(@class,'breadcrumbs')]/a[last()]",
                'required' => true,
            ),
            //ISBN 编码 👍
            array(
                'name' => "isbn",
                'selector' => "//div[contains(@class,'alert-success')]/p[7]",
                'required' => true,
            ),
            // 图片 //img[contains(@class,'alignleft')]/@src 👍
            array(
                'name' => "img",
                'selector' => "//img[contains(@class,'alignleft')]/@src",
                'required' => true,
            ),
            // 云盘链接 //a[text()='百度网盘']/@href 👍
            array(
                'name' => "url",
                'selector' => "//a[text()='百度网盘']/@href",
                'required' => true,
            ),
            // 提取码code 👍
            array(
                'name' => "code",
                'selector' => "//article[contains(@class,'article-content')]/div[last()-1]//strong",
                'required' => true,
            ),
        ),
    );
    
    $spider = new phpspider($configs);
    
    $spider->on_start = function($phpspider)
    {
        requests::set_header('Referer','https://www.nmod.net/page/2');
    
        /*连接数据库*/
        $db_config = $phpspider->get_config("db_config");
        db::set_connect('default', $db_config);
        db::_init();
    };
    
    // 对匹配后的字段field进行回调处理
    $spider->on_extract_field = function($fieldname, $data, $page)
    {
       echo 'start...2';
       if($fieldname == 'url'){
            $data = str_replace('https://www.nmod.net/go.html?', '', $data);
       }
       if($fieldname == 'format'){
            $data = str_replace('格式:', '', $data);
       }
       if($fieldname == 'author'){
            $data = str_replace('作者:', '', $data);
       }
       if($fieldname == 'code'){
            $data = str_replace('提取码:', '', $data);
       }
        return $data;
    };
    
    // 数据入库操作
    $spider->on_extract_page = function($page, $data) 
    {
            // 入库
            db::query("set names utf8");
            // print_r($data);exit();
            mysql_query("set names 'utf8");
            db::insert("list", $res);
    };
    
    $spider->start();
    

    就是这样就跑起来了。看数据库的数据一致在增加还是蛮开心的。

    技术无罪,demo仅仅功学习和交流,如有侵权,请联系我删除。

    相关文章

      网友评论

        本文标题:使用phpspider爬取电子书

        本文链接:https://www.haomeiwen.com/subject/ywddgctx.html