php之小白爬虫

PHP爬取简单的数据

1.使用插件querylist
使用composer下载 命令
composer require jaeger/querylist
引用
use QL\QueryList;
完事~
2.爬取简单的html标签内容
使用querylist通过类似于jq选择器选择标签十分方便

    $ql = QueryList::get('https://www.ithome.com/html/discovery/358585.htm');

    $rt = [];
    // 采集文章标题
    $rt['title'] = $ql->find('h1')->text();
    // 采集文章作者
    $rt['author'] = $ql->find('#author_baidu>strong')->text();
    // 采集文章内容
    $rt['content'] = $ql->find('.post_content')->html();

    print_r($rt);

数组对应的键和值。
使用的find选择器
在这里插入图片描述
再来一个栗子~

// A code block
var foo = 'bar';
 $url = 'http://www.qiushuge.net/zhongjidouluo/1115.html';
        $rules = [
            'totol' => ['.bg','text'],
        ];
        $rt = QueryList::get($url)->rules($rules)->query()->getData();
        print_r($rt);
        // if($rt){
        //     print_r($rt[0]['totol']);
        // }
        // else{
        //     print_r("===");
        // }
        // 结果是一个二维数组


//使用的rules()函数  官方称之为采集 更方便了~
$rules = [
    '规则名1' => ['选择器1','元素属性'],
    '规则名2' => ['选择器2','元素属性'],
    // ...
];
//还有个语法糖

//$rt = QueryList::get($url)->rules($rules)->query()->getData(); print_r($rt->all());
//print_r($rt);

//$rt = QueryList::get($url)->rules($rules)->queryData();
//print_r($rt);
//queryData()方法等同于query()->getData()->all() 。

在这里插入图片描述
更多请阅读querylist官方文档
https://juejin.im/entry/59d38e2cf265da065c5eb54f
3.爬取图片
爬取图片才是有点用的东西~感觉也不是很有用,算啦,不说废话了,直接上代码。
// 保存多图片

    set_time_limit(300);                        // 设置程序执行超时时间为5分钟

     // for($j = 1; $j <= 2; $j++ ){
        // print $j;
        // echo "</br>";
    //手动选择第三页
    $j = 3;
    $url = 'https://api.bilibili.com/pgc/season/index/result?season_version=-1&area=-1&is_finish=-1&copyright=-1&season_status=-1&season_month=-1&year=-1&style_id=-1&order=3&st=1&sort=0&page='.$j.'&season_type=1&pagesize=20&type=1&tdsourcetag=s_pcqq_aiomsg';
    $jsonStr = file_get_contents($url);
    $json = json_decode($jsonStr);
    $imgArr = [];
    // count($json->data->list)
    for($i = 0; $i < count($json->data->list); $i++ ){
        array_push($imgArr,$json->data->list[$i]->cover);
    }
    // }
    // print_r($imgArr);
    // 要下载的图片数组
    $beginTime = time();            // 开始下载图片的时间
    $lastTime = $beginTime;         // 上一次下载图片的时间
    $count = 0;                     // 计数器
    echo 'begin download at ' . date('Y-m-d H:i:s', $beginTime) . '<br/>';      // 输出开始下载图片的时间

    // 循环添加curl句柄
    $mh = curl_multi_init();                                        // 开启curl多线程
    foreach ($imgArr as $k => $v) {
        $ch[$k] = curl_init();                                      // 初始化curl句柄
        curl_setopt($ch[$k], CURLOPT_URL, $v);                      // 设置要下载的图片
        curl_setopt($ch[$k], CURLOPT_RETURNTRANSFER, 1);            // 设置获取图片内容而不直接在浏览器输出
        curl_setopt($ch[$k], CURLOPT_HEADER, 0);                    // 设置只获取图片内容,不返回header头信息
        curl_multi_add_handle($mh, $ch[$k]);                        // 添加curl多线程句柄    
    }

    // 开启curl多线程下载图片
    do {
        $status = curl_multi_exec($mh, $active);
        $result = curl_multi_info_read($mh);
        if ($result !== false) {
            $content = curl_multi_getcontent($result['handle']);                          // 获取图片内容
            $picName = substr($imgArr[$count], strrpos($imgArr[$count], '/')+1);              // 获取图片名称
            $savePath = ROOT_PATH.'public/goods/img/';                                 // 设置保存图片的路径
            if (!is_dir($savePath)) {                               // 如果图片路径不存在,则创建路径
                @mkdir($savePath, 0777);
            }
            $saveName = $savePath . $picName;                       // 设置图片保存为的文件名称
            $fp = @fopen($saveName, 'w');                           // 打开文件
            fwrite($fp, $content);                                  // 把获取到的图片内容写入到新图片
            fclose($fp);                                            // 关闭文件句柄
            $nowTime = time();                                      // 当前时间
            $takeTime = $nowTime - $lastTime;                       // 下载此张图片消耗的时间
            ++$count;                                               // 计数器+1
            echo 'downloaded ' . $count . 'th picture take time ' . $takeTime . 's<br/>';               // 输出下载当前图片消耗的时间
            $lastTime = $nowTime;                                   // 把当前时间设置为上一张图片下载时间
        }
    } 
    while ($status == CURLM_CALL_MULTI_PERFORM || $active);
    curl_multi_close($mh);                                      // 关闭curl多线程句柄

    $endTime = time();                                          // 结束下载图片的时间
    $totalTime = $endTime - $beginTime;                         // 总耗时
    echo 'end download at ' . date('Y-m-d H:i:s', $endTime) . '<br/>';          // 输出下载图片完成的时间
    echo 'downloaded ' . $count . ' pictures take time ' . $totalTime . ' s<br/>';         // 输出总耗时

在这里插入图片描述
博文参考:
https://idoubi.cc/2016/12/30/%E5%9C%A8php%E4%B8%AD%E4%BD%BF%E7%94%A8curl%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E8%BD%BD%E5%9B%BE%E7%89%87/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值