不到100行(带注释)实现多线程自动翻页采集

浏览:904 发布日期:2019/04/05 分类:功能实现 关键字: php curl composer 采集
采用了composer 安装了两个类库php-curl-class 和medoo,一个是curl的操作库,一个是支持多数据库的类{ "require": {
"php-curl-class/php-curl-class":"dev-master",
"catfan/medoo": "1.6.*"}
}
自己新建一个composer.json,然后composer install,
代码的主体如下,我的小站 http://3d5156.com ,目前采集超过10万数据

效果图如下:
-----------------------------------------




1、首先我们选定一个目标站,因为喜欢玩单机游戏,所以找个单机下载站99单机游1戏,网站在代码里头。
2、在刚刚composer的同一级目录新建一个download.php,然后将下面的代码复制进去,保存,
3、在浏览器输入 http://你的网址/download.php?startnum=1&endnum=10&orders=1
其中startnum 是起始页1,endnum 是结束页,现在我们来采集1-10
orders=1 表示从1开始采集到第10页,如果等于其他就是倒序从10到第1页。<?php
set_time_limit(0);
require __DIR__ . '/vendor/autoload.php';
use \Curl\Curl;
use \Curl\MultiCurl;
use Medoo\Medoo;

if(intval($_REQUEST['startnum']) ==0) { echo '请输入正确的URL 例如:http://127.0.0.1/dataget/download.php?startnum=1&endnum=10&orders=1' ; die();}

if($_REQUEST['orders'] =='1'){
    $page =$_REQUEST['startnum'];
}else{
    $page =$_REQUEST['endnum'];
}

$url ='http://www.99danji.com/gamelist/2_'.$page.'.html';

$curl = new Curl();
$curl->setUserAgent('MyUserAgent/0.0.1 (+https://www.baidu.com/bot.html)');
$curl->setReferrer('http://www.99danji.com/gamelist/2_2.html');
$data = $curl->get($url); //获取列表页
$list =data_cut('<ul class="mod-img-list games">' , '</ul>' , $data); //截取内容 
preg_match_all('|<a href=\"([^"]*)\" target="_blank" class="img-box">|', $list , $matches); //正则匹配url matches[1]

//开始进行多线程请求内容页
$multi_curl = new MultiCurl();
$multi_curl->setUserAgent('MyUserAgent/0.0.1 (+https://www.baidu.com/bot.html)');
$multi_curl->setReferrer('http://www.99danji.com/gamelist/2_2.html');
foreach ($matches[1] as $k => $v) {
    $multi_curl->addGet($v);
}

$multi_curl->success(function($instance) {
    data_callback($instance->response); //处理数据的函数
    echo '<hr>';
});

$multi_curl->start(); //开始采集

if($_REQUEST['orders']=='1'){  //分页跳转
    $_REQUEST['startnum'] = $page+1;
}else{
    $_REQUEST['endnum'] = $page-1;
}   
if($_REQUEST['startnum'] > $_REQUEST['endnum']) { echo '采集完成<a href="download.php">点击返回</a>'; die();}  //采集完成

$newUrl ='./download.php?startnum='.$_REQUEST['startnum'].'&endnum='.$_REQUEST['endnum'].'&orders='.$_REQUEST['orders'];  //跳转地址
$str .='正在采集'.$page;
$str .='<script language="javascript" type="text/javascript">';
$str .='window.location.href="'.$newUrl.'"';
$str .='</script>';
echo $str;

//--------------数据处理的函数------------------
function data_cut($start,$end,$str){
    $temp=explode($start,$str,2);
    $content=explode($end,$temp[1],2);
    return $content[0];
}

function data_callback($content)
{
    global $database;
    if($content =='') return false;
    $data =[];
    $data['title'] =data_cut('<h1>' , '</h1>' , $content); //软件名称
    $data['catname'] =data_cut('<dd><span>游戏类型:</span>' , '</dd>' , $content); //类别
    //。。。。。更多操作,用正则,字符替换,字符截取,获取软件的内容,大小,图片,地址等
    echo ($data['title'].'_'. $data['catname']); //数据测试
    return false;
    //插入数据
    $database->insert("soft", [  "title" => $data['title'],"catname" => $data['catname'] ]);
}

$database = new Medoo([
    'database_type' => 'mysql',
    'database_name' => 'gamesoft',  //数据库
    'server' => '127.0.0.1',
    'username' => 'root',
    'password' => 'root',
    // [optional]
    'charset' => 'utf8',
    'port' => 3306,
     //表前缀
    'prefix' => '', 
    // 日志
    'logging' => true, 
    // [optional] driver_option for connection, read more from http://www.php.net/manual/en/pdo.setattribute.php
    'option' => [
        PDO::ATTR_CASE => PDO::CASE_NATURAL
    ],
    // [optional] Medoo will execute those commands after connected to the database for initialization
    'command' => [
        'SET SQL_MODE=ANSI_QUOTES'
    ]
]);

附件 1831854781.jpg ( 64.74 KB 下载:19 次 )

评论( 相关
后面还有条评论,点击查看>>