200行代码扒掉了一个素材网站所有数据,php是最好的语言,不假!

2022-04-29 14:16:24 浏览数 (1)

作者:阿dai哥

教程分享

TUTORIAL TO SHARE

我只用了不到200行代码,把一个素材网站的整个数据库扒了下来。

这是我用php语言写的第一个爬虫脚本,使用了一个相对来说比较常用的一个php爬虫框架,【phpspider】 爬虫框架,特别是对与新手来说很简单入手,使用手册百度一大堆,但是百度上很多都是坑。欢迎进群学习交流:876480216(QQ群)

分享效果说明

SHARE THE BODY

这个素材的网站效果图大概是这样的(由于其它问题就不公布网址)

实现代码

THE IMPLEMENTATION CODE

由于我使用的是phpspider爬虫框架,直接百度就可以拿到这个框架的底层。废话上说直接上代码吧,如需完整代码请公众号回复关键词:phpspider 即可获取

1.先引入相关的文件

代码语言:javascript复制
require_once __DIR__ . '/../autoloader.php';
use phpspidercorephpspider;
use phpspidercorerequests;
use phpspidercoredb;

2.建一个配置数组

代码语言:javascript复制
$configs = array(
    'name' => '扒静态网页模板数据',
    'log_show' => true,
    'tasknum' => 1,
    //'save_running_state' => true,
    'domains' => array(
        'ceshi.com',
        'www.ceshi.com'
    ),
    'scan_urls' => array(
        'http://www.ceshi.com/'
    ),
    'list_url_regexes' => array(
        "http://www.ceshi.com/index.php?m=Home&c=Article&a=search&type=cateinside&key=3&p=d "
    ),
    'content_url_regexes' => array(
        "http://www.templatesy.com/Article/d "
    ),
    // 'max_fields' => 5,
    'max_try' => 20, //爬虫爬取每个网页失败后尝试次数   网络不好可能导致爬虫在超时时间内抓取失败, 可以设置此项允许爬虫重复爬取
    'export' => array(
        'type' => 'db',
        'table'=> 'jk_templets2',    //表名
    ),
    'db_config' => array(
        'host'  => '127.0.0.1',
        'port'  => 3306,
        'user'  => 'root',    //mysql的账号
        'pass'  => 'root',   //mysql的密码
        'name'  => 'gx',   //数据库库名
    ),
    'fields' => array(
        array(
            'name' => "title",
            'selector' => '//*[@id="main-container"]/div/div/div[1]/article/div[1]/div[1]/span',
            'required' => true,
        ),
        array(
            'name' => "type",
            'selector' => '//*[@id="main-container"]/div/div/div[1]/article/div[1]/div[2]/p/a',
            'required' => true,
        ),
        array(
            'name' => 'create_at',
            'selector' => '//*[@id="main-container"]/div/div/div[1]/article/div[1]/div[2]/p/span[5]',
            'required' => true,
        ),
        array(
            'name' => 'browse',
            'selector' => '//*[@id="main-container"]/div/div/div[1]/article/div[1]/div[2]/p/span[9]/span',
            'required' => true,
        ),
        array(
            'name' => 'descs',
            'selector' => '//*[@id="main-container"]/div/div/div[2]/div[1]/p',
            'required' => true,
        ),
        array(
            'name' => 'contents',
            'selector' => '//*[@id="main-container"]/div/div/div[1]/article/div[2]',
            'required' => true,
        ),
        array(
            'name' => 'tags',
            'selector' => '//*[@id="main-container"]/div/div/div[2]/div[2]/p',
            'required' => true,
        ),
        array(
            'name' => 'download',
            'selector' => '//*[@id="main-container"]/div/div/div[1]/article/div[1]/div[2]/p/span[8]/span',
        ),
    ),
    // 随机浏览器类型,用于破解防采集
    'user_agent' => array(
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G34 Safari/601.1",
        "Mozilla/5.0 (Linux; U; Android 6.0.1;zh_cn; Le X820 Build/FEXCNFN5801507014S) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/49.0.0.0 Mobile Safari/537.36 EUI Browser/5.8.015S",
    ),
    //爬虫爬取网页所使用的伪IP。随机伪造IP,用于破解防采集
    'client_ip' => array(
        '192.168.0.1',
    ),

关键参数说明:

(1)name:当前爬虫的名称

(2)domains:你的目标爬虫,只要提供对应的链接即可

(3)list_url_regexes:待扒取的列表,把对应的变量使用正则匹配替换

(4)content_url_regexes:待扒取的详情页,把对应的变量使用正则匹配替换

(5)max_try:爬虫爬取每个网页失败后尝试次数 网络不好可能导致爬虫在超时时间内抓取失败, 可以设置此项允许爬虫重复爬取

(6)fields:你要的数据(使用了Xpath 定位数据插件)

(7)user_agent:随机浏览器类型,用于破解防采集

(8)client_ip:爬虫爬取网页所使用的伪IP。随机伪造IP,用于破解防采集

更多参数说明请看:百度phpspider一大堆。

3、然后实例化这个

代码语言:javascript复制
$spider = new phpspider($configs);

4、链接数据库操作,首先是要先建立一个数据表,下面就是我建的表很简单

代码语言:javascript复制
$spider->on_start = function($phpspider) 
{
    $db_config = $phpspider->get_config("db_config");
    // 数据库连接
    db::set_connect('default', $db_config);
    db::_init();
};

3、入库前数据处理操作,看自己的需求相应的做数据处理,每个人要扒的数据都不一样,自己看着办吧!

代码语言:javascript复制
$spider->on_extract_page = function($page,$data){
    //把日期转为时间戳,注意:先付给一个变量,然后使用strtotime 否则会报错 至于为什么我也不清楚
   $create_at = $data['create_at'];
    $create_at = strtotime($create_at);
    $data['create_at'] = $create_at;
    //下载次数
    if($data['download'] == ''){
        $data['download'] = 0;
    }
    //判断分类
    $type = $data['type'];
    if($type == '企业网站'){
        $data['type'] = 1;
    } elseif($type == '博客网站'){
        $data['type'] = 2;
    } elseif($type == '后台网站'){
        $data['type'] = 3;
    } elseif($type == 'Wap网站'){
        $data['type'] = 4;
    } elseif($type == '商务网站'){
        $data['type'] = 5;
    } elseif($type == 'H5游戏'){
        $data['type'] = 6;
    } elseif($type == '插件'){
        $data['type'] = 7;
    } elseif($type == '其他'){
        $data['type'] = 8;
    } else{
        $data['type'] = 0;
    }
    //标签
  $tag_value = $data['tags'];
    $tags = preg_replace('/<.*?>/', ',', $tag_value);   //去掉a标签
  $tags = trim($tags);    //去掉左右空格
  $tags = str_replace(',,', ',', $tags);  //把',,'换成','
    $tags = trim($tags, ',');   //去掉左右的','
    $data['tags'] = $tags;
    //转成数组,查询数据库标签对呀的id替换掉
    return $data;
};

3、最后就是执行这个方法

代码语言:javascript复制
$spider->start();

爬虫代码到这里就已全部写完了,接下来是测试能不能扒到数据。

执行的方法是在命令行操作,直接网页打开是执行不到效果的,接下来我们一起看看能不能执行成功。

先进到你脚本的位置,如我的:

我的文件名是:muban.php

直接执行: php muban.php,就会出现下面的画面

等待2秒钟左右就会出现如下的数据,数据不断的循环出来,这就是你爬虫起了作用,正在爬取数据进入数据库,不是有所的数据都成功的。

等待系统停止。

我大概过了5分钟左右爬虫就停止了,具体的时间要看目标网站的数据有多大。

我看了一下我的数据库的数据,成功爬到的数据有719条。

0 人点赞