当前位置:AIGC资讯 > 数据采集 > 正文

只为了证明PHP是最好的语言

<?php
/×
只为了证明PHP是最好的语言。
目前设计的该程序是顺序执行,生产和消费者没有分开,使用来一个死循环,不断从redis的list里取出最新的QQ号码,然后用该QQ号码拼接出需要网站的地址,一次访问并存入mongodb,这里只是整个实现的流程代码,没有写QQ空间API接口。由于我分析的接口返回的是json,所以我直接存入mongodb。回来分析也非常方便。为了加大速度,我目前开了10进程,虽然没有到腾讯封IP的极限,但是以及到来我的笔记本的极限了。10个进程24小时可以采集180W,如果电脑配置高点,一天200多万不是问题。
其中,懒得自己写curl类,用之前大神爬取知乎的时候写的类
https://github.com/hhqcontinue/zhihuSpider



××/
include "phpspider/config.php";
include "phpspider/cache.php";
include "phpspider/rolling_curl.php";


$cookie = trim(file_get_contents("cookie.txt"));

$curl = new rolling_curl();
$curl->set_cookie($cookie);
$curl->set_gzip(true);
$curl->callback = function($response, $info, $request, $error) {

    preg_match("#xxxxx#", $request['url'], $out);
    $qq = $out[1];

 

    if (empty($response)) 
    {
       
        file_put_contents("./data/error_timeout.log", date("Y-m-d H:i:s") . ' ' . $username.' --- '.json_encode($error)."\n", FILE_APPEND);
        // 注意这里不要用 exit,否则整个程序就断开了
        return;
    }

    // 如果是个人信息
    if (strpos($request['url'], 'a') ==true )
    {
     //将信息添加至mongodb,先判断是否是错误信息
    }
    
    //如果是来访QQ
    if (strpos($request['url'], 'b') == true)
    {
       //将信息添加至mongodb,先判断是否是错误信息
       //从中取出QQ号码存入redis
       cache->get_instance()->lpush("qq");//一定要从左端插入,否则是出现死循环,例如A访问来B空间,B同样也访问来A空间,如果在设置网址的时候取先存入的QQ,程序就会不断在A和B之间访问,如果设置网址的时候取最新的则会将他们存入栈底部
    }
    
    
    //如果是说说
    if (strpos($request['url'], 'c') == true)
    {
     ///将信息添加至mongodb,先判断是否是错误信息
    }
    

    
};

while(true){
        $qq=cache->get_instance()->lpop("qq");//用从左端删除
        if ($qq=="")$qq="12345678";//这里是登录的QQ号码
         $url = "http://a".$qq;//个人信息
        $curl->get($url);
        $url = "http://b".$qq;//来访QQ
        $curl->get($url);
         $url = "http://c".$qq;//最近说说
        $curl->get($url);
          $data = $curl->execute();
    // 睡眠100毫秒,太快了会被认为是ddos
    usleep(100000);
}



因为,生产者和消费者没有分开,所以其中有一个问题,就是生产者产生的QQ号码多,消费者使用速度低,所以建议将采集QQ来访者和采集数据分开,采集数据可以多开写进程


用到的类库地址https://github.com/hhqcontinue/zhihuSpider

更新时间 2023-11-08