编程语言-PHP

使用phpspider爬取电子书

2019-12-08  本文已影响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仅仅功学习和交流,如有侵权,请联系我删除。

上一篇下一篇

猜你喜欢

热点阅读