在没有启用 Javascript 的情况下无法抓取网站 - Laravel

问题描述 投票:0回答:1

我正在尝试使用 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 php laravel web-scraping permission-denied
1个回答
0
投票

您面临的问题与您尝试抓取的网站依赖 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。

注意:抓取网站时要小心,并务必查看网站的服务条款以确保合规性。一些网站在其条款中明确禁止抓取,未经授权的抓取可能会导致法律后果。始终确保您的抓取活动受到尊重并遵守适用的法律和法规。

© www.soinside.com 2019 - 2024. All rights reserved.