如何在 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”?的主要内容,如果未能解决你的问题,请参考以下文章