如何在 laravel 中使用 goutte 库抓取“https://shopee.co.id/search?keyword=phone”?

Posted

技术标签:

【中文标题】如何在 laravel 中使用 goutte 库抓取“https://shopee.co.id/search?keyword=phone”?【英文标题】:How to Scrape "https://shopee.co.id/search?keyword=phone" with goutte library in laravel? 【发布时间】:2021-08-31 23:01:48 【问题描述】:

我想从下面的代码中获取价值,但结果是空的。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Goutte\Client;

class ScrapeController extends Controller

    private $results = array();

    public function scraper()
        $client = new Client();
        $raw = $client->request('GET', 'https://shopee.co.id/search?keyword=phone');
        $raw->filter('.col-xs-2-4')->each(function ($item) 
            $this->results[$item->filter('._1nHzH4')->text()] = $item->filter('_32hnQt')->text();
            
        );
        return $this->results;
    

此代码无法正常工作。谁能给我解决方案?

【问题讨论】:

https://shopee.co.id/search?keyword=phone 返回的 html 没有任何具有该类名的元素 - 元素是动态创建的(使用该 html 文档中加载的 javascript) - 您的代码是否评估并运行 javascript - 如果不是,那么您就不能那么容易地废弃该网站 @JaromandaX 我明白了。但如果那是一个动态元素,我怎样才能得到真正的元素? 我没有说 IT 是一个动态元素(不管它是什么)...我说你寻找的那些元素是动态创建的,它们是“真实的”,只是不在 HTML 文档中你得到了 @JaromandaX 是的,我知道。我只想获取产品的价格和标题,但找不到可以用作过滤器对象的类或 ID。 因为它不存在,我已经说过两次了 【参考方案1】:

使用 Guzzle HTTP 客户端从 Laravel 应用程序发出请求。

private $results = array();

public function scraper()
    $client = new Client();
    $guzzleClient = new GuzzleClient(array());
    $client->setClient($guzzleClient);
    //then make request
    $raw = $client->request('GET', 'https://shopee.co.id/search?keyword=phone');
    $raw->filter('.col-xs-2-4')->each(function ($item) 
        $this->results[$item->filter('._1nHzH4')->text()] = $item->filter('_32hnQt')->text();
        
    );
    return $this->results;

【讨论】:

【参考方案2】:

发生这种情况是因为页面的内容是通过 javascript 加载的,如果您想抓取您需要首先使用 phantomjs 之类的工具执行 javascript 或使用 php 库 @987654322 的页面@. 所以在你的情况下,步骤将是: 1:使用 phantomjs 执行 javascript 并获取原始 HTML 2:将HTML传递给goutte,然后过滤数据

【讨论】:

对不起,phantomjs 必须使用 laravel 5 或 6 吗?因为当我在使用 composer 安装 phantom 时总是出错 我不太清楚,但是 v6 或 7 应该没问题 我可以得到一些资料来阅读吗?因为我一直在尝试,但是当我尝试在终端中输入 composer require "jonnyw/php-phantomjs:4.*" 时,我总是收到错误消息“您的要求无法解析为一组可安装的软件包。”

以上是关于如何在 laravel 中使用 goutte 库抓取“https://shopee.co.id/search?keyword=phone”?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Goutte 获取响应状态代码

PHP使用Goutte不校验SSL证书

从返回的节点的 Goutte 请求中提取特定的 xml

Laravel个人博客集成Elasticsearch和ik分词

什么会导致Goutte驱动程序不遵循重定向?

ethereal抓包工具