使用DomCrawler抓取快手美女小视频

本周任务需要抓取快手丶抖音美女小视频来为LinXin项目引流做准备.

2018年05月27日10:35:28 实习第四周 XXM

1.入口视频URL.

首先我们需要找到一个视频链接为入口;

//视频入口
        $url              = 'https://live.kuaishou.com/profile/1xPaCXnlajP7K5JBnPfpQlVw';
$Crawl            = $this->client->request('GET', $url);

然后我们通过DomCralwer发起请求,获得该网页的HTML.

按照要求需要爬取 用户的一些信息.

$userName 用户昵称

$userId 用户ID

$user_description 用户描述信息

user_gender 用户性别

然后我们使用浏览器打开该网页进行分析

2018-05-27 10-45-06屏幕截图.png

2.通过HTML特征解析信息

$userName         = $Crawl->filterXPath('//p[@class="user-info-name"]')->text();
        $userName         = trim($userName);
        $userId           = $Crawl->filter('.user-info-id')->text();
        $userId           = str_replace('用户ID:', '', $userId);
        $user_description = $Crawl->filter('.user-info-description')->text();
        $user_gender=count($Crawl->filter('.female'))?'女':'男';

得到该网页的HTML后,我们通过查看,发现该网页用户的视频链接全部存放在<p class="work-card" data-v-10ed0156 data-v-0bf6f62c>当中A标签里面,我们通过DomCrawler解析类名work-card下面的A标签中的href属性得到所需的视频链接.

$videoUrls = $Crawl->filter('.work-card>a')->each(function ($node) {
            return 'http:' . $node->attr('href');
        });

以上操作完成后,我们就得到了该用户的视频链接以及部分需求信息.

3.视频页抓取

得到小视频URL后,我们开始对每个视频进行抓取.

所有的视频链接都存在一个Array当中,我们使用foreach来迭代出每一个URL.

但是在访问视频页面的时候出现了部门快手视频页面自动跳转到快手APP首页的,经过几次测试,猜测这种情况可能是快手APP反爬设置,于是我们通过rand函数来随机生成一个访问的timer,来模拟人为的访问.

//随机时间 访问
            $time = rand(3, 8);
            echo $time . " seconds ---\n";
            sleep($time);

然后通过file_get_contentsh函数来获取我们相应的视频页HTML,为了防止页面打开跳转,我们在对视频抓取之前,先判断一下是否存在跳转页面的特征.

$html = @file_get_contents($vUrl);
strpos($html, '<body onLoad="javascript:jump()">') === false

如果不存在,我们就使用DomCrawler解析出当前小视频页的真实下载地址.

$Crawl = new Crawler();
$Crawl->addHtmlContent($html);
$videoUrl    = $Crawl->filter('video')->attr('src');
$description = $Crawl->filter('.words')->first()->text();
$videoUrlsArr[] = $videoUrl;

4.视频保存到本地

得到视频的真实下载地址后,我们便需要把视频写入到我们本地磁盘上.

我们使用PHP系统函数fopen()来创建一个写入文件,

然后通过file_get_contentsh来把视频读入一个字符串当中,

fwrite() 函数用来写入到对应的文件当中,

最后再使用fclose()函数关闭写入文件.

最后文件便成功地写入到了我们本地的磁盘上.

全部代码:

<?php
namespace App\Console\Commands\Crawlers;

use Goutte\Client;
use Illuminate\Console\Command;
use Symfony\Component\DomCrawler\Crawler;

class CrawlKuaiShou extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'crawl:lxks';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '邻信快手视频';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
        $this->client = new Client();
        $this->client->setHeader('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36');
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
        $this->getList();
    }

    public function getList()
    {
        //视频入口
        $url              = 'https://live.kuaishou.com/profile/1xPaCXnlajP7K5JBnPfpQlVw';
        $Crawl            = $this->client->request('GET', $url);
        $userName         = $Crawl->filterXPath('//p[@class="user-info-name"]')->text();
        $userName         = trim($userName);
        $userId           = $Crawl->filter('.user-info-id')->text();
        $userId           = str_replace('用户ID:', '', $userId);
        $user_description = $Crawl->filter('.user-info-description')->text();
        $user_gender=count($Crawl->filter('.female'))?'女':'男';
        //一轮清洗
        $videoUrls = $Crawl->filter('.work-card>a')->each(function ($node) {
            return 'http:' . $node->attr('href');
        });
        dd($videoUrls);
        $videoUrlsArr = [];
        foreach ($videoUrls as $vUrl) {
            //随机时间 访问
            $time = rand(3, 8);
            echo $time . " seconds ---\n";
            sleep($time);
            $html = @file_get_contents($vUrl);
            if (strpos($html, '<body onLoad="javascript:jump()">') === false) {
                $Crawl = new Crawler();
                $Crawl->addHtmlContent($html);
                $videoUrl    = $Crawl->filter('video')->attr('src');
                $description = $Crawl->filter('.words')->first()->text();
                $videoUrlsArr[] = $videoUrl;
                $myfile = fopen('storage/lxapp/'.'ks-'.$userId.'-'.date('YmdHms'), "w") or die("Unable to open file!");
                $video=file_get_contents($videoUrl);
                fwrite($myfile, $video);
                fclose($myfile);
                echo "Video success";
                $this->info('url:' . $videoUrl . ' get success');

            } else {
                $this->info('bad url');
            }
        }
        dd($videoUrlsArr);
        //2018年05月20日11:57:12 视频保存到本地  未入库
    }
}

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容