簡體   English   中英

嘗試抓取 web 頁面時出現“無 javascript”錯誤

[英]“no javascript” error when trying to scrape web page

public class SearchWalm {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://www.walmart.ca/en/electronics/N-32+103/page-13?sortBy=newest&orderBy=DESC"))
                .GET()
                .build();

        HttpResponse<String> response = client.send(request,
                HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}

我正在嘗試編寫一個程序,該程序將篩選沃爾瑪清關部分的頁面,然后篩選 select 關鍵字並告訴我它在哪個頁面上找到了該關鍵字。

我收到錯誤“無 javascript”和“您的 web 瀏覽器未運行 javascript”。 我需要通過瀏覽器運行它還是只有 Java 這樣做?

無頭瀏覽器可以解決抓取問題,但不幸的是,您的網站使用 javascript 按需加載內容。 要抓取按需數據加載,需要一個實際的瀏覽器。

我們使用JsoupSelenium WebDeiver來解決這個問題。 Selenium WebDriver 可以允許隱式等待(您設置計時器)或流利等待。 使用此等待,我們將等待所需數據完全加載。 收到我們的內容后,您使用 jsoup 解析數據並找出您想要的結果。

您還需要在您的機器上安裝 Chrome/Firefox 瀏覽器,並且需要 ChromeDriver/FirefoxDriver。

  • 安裝 Homebrew 的 Mac 用戶: brew tap homebrew/cask && brew cask install chromedriver
  • Debian 基於 Linux 發行版:sudo apt-get install chromium-chromedriver
  • Windows 安裝 Chocolatey 的用戶:choco install chromedriver

現在你運行下面的代碼,它可以從搜索結果中搜索並顯示標題。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
import java.util.concurrent.TimeUnit;


public class WebScraperJsOnload {
    public static void main(String[] args) throws IOException {
        
        String queryString = "https://www.walmart.ca/en/electronics/N-32+103/page-13?sortBy=newest&orderBy=DESC";
        
        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        driver.get(queryString);
        
        Document doc = Jsoup.parse(driver.getPageSource());
        
        Elements newsHeadlines = doc.select(".title");
        for (Element headline : newsHeadlines) {
            log("Log: %s",headline.html());
        }
        
    }

    private static void log(String msg, String... vals) {
        System.out.println(String.format(msg, vals));
    }
}

此導入的 Maven 依賴項,

<dependency>
    <!-- jsoup HTML parser library @ https://jsoup.org/ -->
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.13.1</version>
</dependency>
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.141.59</version>
</dependency>

此代碼 output 看起來像,

Log: <h2 class="thumb-header">Clearance Sale DR-E15 Fake Battery DC Coupler Battery Holder Mount Plate Power Supply Set Black</h2>
Log: <h2 class="thumb-header">Clearance Sale 2 in 1 4.7 inch Wireless U Disk Memory Expansion Phone Case for iPhone 6/6S/7 Red</h2>
Log: <h2 class="thumb-header">Clearance Sale USB Charging Power LED Selfie Ring Filling Light With Mobile Phone Clip Holder Black</h2>
Log: <h2 class="thumb-header">Clearance Sale Nillkin Protective Cover Plastic Hard Back Case Protect Mobile Phone Shell Red</h2>
Log: <h2 class="thumb-header">Clearance Sale Children'S Alarm Clock Creative Cute Cartoon Luminous Led Electronic Clock Pink</h2>
...
... 

如需完整的項目,請下載此Github Repo

這有點像 java 的東西。 在 Java 中執行請求時,您發送不同的標頭集。 我試過 url 並且當您附加“接受:*/*”header 時工作正常。

你不能用你當前的實現來做,用HttpClient重新實現它並添加缺少的 header。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM