我正在尝试使用 Laravel 抓取此网站:https://datacvr.virk.dk/soegeresultater?sideIndex=0&enhedstype=virksomhed&antalAnsatte=ANTAL_20_49&virksomhedsstatus=aktiv%252Cnormal&size=10
与其他网站,例如维基百科,以下代码可以顺利运行。但是,在此网站上它会返回一个错误 HTML 页面,其中显示以下错误: “我们很抱歉,如果没有启用 JavaScript,客户端将无法正常工作。请启用它以继续。” 我想 Javescript 未启用的原因是因为我使用 Laravel Symfony 进行网页抓取,如下所示。
<?php
namespace App\Http\Controllers;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\BrowserKit\HttpBrowser;
class CompaniesController extends Controller
{
public function index() {
$client = new HttpBrowser(HttpClient::create());
$crawler = $client->request('GET', 'https://datacvr.virk.dk/soegeresultater?sideIndex=0&enhedstype=virksomhed&antalAnsatte=ANTAL_20_49&virksomhedsstatus=aktiv%252Cnormal&size=10');
return $crawler->html();
}
}
我也尝试按照本教程进行操作:https://webmobtuts.com/backend-development/using-laravel-and-symfony-panther-to-scrape-javascript-websites/ 我尝试使用 Symfony Panther 客户端来模拟/创建 Chrome 客户端。你可以在这里看到我的代码:
<?php
namespace App\Http\Controllers;
use Symfony\Component\Panther\Client;
class CompaniesController extends Controller
{
public function index() {
$client = Client::createChromeClient(); // create a chrome client
$crawler = $client->request('GET', 'https://datacvr.virk.dk/soegeresultater?sideIndex=0&enhedstype=virksomhed&antalAnsatte=ANTAL_20_49&virksomhedsstatus=aktiv%252Cnormal&size=10');
$client->waitFor('div');
return $crawler->html();
}
}
但是,这会返回类似的错误:在 HTML 页面中“启用 JavaScript 和 cookies 以继续”。
如何在网页抓取中启用 JavaScript?我是否需要在请求的标头中添加一些内容,或者使用不同的库?
您面临的问题与您尝试抓取的网站依赖 JavaScript 来呈现内容有关,而您使用的 Symfony Panther 或 Symfony BrowserKit 组件不执行 JavaScript。
要抓取严重依赖 JavaScript 的网站,您可以考虑使用无头浏览器自动化工具。一个流行的选择是 Puppeteer,它是一个用于控制无头浏览器的 Node 库。
以下是如何将 Puppeteer 与 Laravel 结合使用:
1.通过Composer安装Puppeteer:
composer require symfony/panther
2.在控制器中使用 Puppeteer:
<?php
namespace App\Http\Controllers;
use Symfony\Component\Panther\PantherTestCase;
class CompaniesController extends Controller
{
public function index()
{
PantherTestCase::startWebServer();
$client = PantherTestCase::createPantherClient();
$crawler = $client->request('GET', 'https://datacvr.virk.dk/soegeresultater?sideIndex=0&enhedstype=virksomhed&antalAnsatte=ANTAL_20_49&virksomhedsstatus=aktiv%252Cnormal&size=10');
// Wait for some JavaScript content to load if needed
$client->waitFor('.some-element-class');
return $crawler->html();
}
}
在此示例中,PantherTestCase::createPantherClient() 创建一个利用无头 Chrome 浏览器的 Panther 客户端,允许您与 JavaScript 渲染的内容进行交互。
确保在开发环境(php artisanserve)中运行您的应用程序,因为 Panther 需要运行 Web 服务器。
现在运行代码,当您访问 Laravel 应用程序时,它应该使用 Panther 来抓取网站,包括执行 JavaScript。
注意:抓取网站时要小心,并务必查看网站的服务条款以确保合规性。一些网站在其条款中明确禁止抓取,未经授权的抓取可能会导致法律后果。始终确保您的抓取活动受到尊重并遵守适用的法律和法规。