【问题标题】:Why when getting html code by view source code is different than using Java code?为什么通过查看源代码获取 html 代码与使用 Java 代码不同?
【发布时间】:2020-01-06 18:52:55
【问题描述】:

我正在尝试通过以下代码获取 html 内容:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class Main {

    public static String getHtmlContent(String urlAddress) {
        URL url;
        try {
            url = new URL(urlAddress);
            URLConnection conn = url.openConnection();
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String inputLine;
            StringBuilder stringBuilder = new StringBuilder();
            while ((inputLine = br.readLine()) != null) {
                stringBuilder.append(inputLine);
            }
            br.close();
            return stringBuilder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        String urlEmpik = getHtmlContent("https://myduolife.com/shop/products/1/780,duolife-keratin-hair-complex.html");
        System.out.println(urlEmpik);
    }
}

问题是当我进入这个网站并在网站上制作(点击鼠标)“查看源代码”时,HTML 内容与我使用我的(上面的)Java 代码时不同。此代码适用于大多数网站,但有些网站无法正常工作,我的意思是 HTML 源代码不同。不知是什么原因?也许它与某些网站上的某些特殊安全性有关?谢谢你的帮助。

【问题讨论】:

  • 没看过,但我猜他们在页面加载时会运行一些 JavaScript,而简单的 HTTP GET 不会重现。尝试在禁用 JavaScript 的浏览器中访问该网站。
  • 也许你是对的,听起来很明智,但是如何将 Javascript 转换为 Java 代码呢?如何在禁用 JS 的情况下使用 Java 获取 HTML 内容?
  • 你可以试试 Selenium selenium.dev

标签: java html web-scraping


【解决方案1】:

有一个答案,通常称为“专有握手”和“专有服务器”。可以做的不多,但是有一些方法可以增加服务器的 HTML 响应更接近程序员在使用浏览器时获得的响应的可能性。大多数情况下,请记住 Web 服务器是由现实世界中的开发人员编写的,并且许多更受欢迎的网站会根据谁在询问来微调收到的 HTML 响应。如果是 Java 程序,可能会被告知立即离开。

注意:为此学习 Selenium 会有所帮助,但 Selenium 存在其他问题和错误 - 并且很复杂。

适用于许多服务器的一个途径是“用户代理”(并注意假冒是否有效):

HttpURLConnection con = (HttpURLConnection) url.openConnection();
String USER_AGENT = "Chrome/61.0.3163.100";
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", USER_AGENT);
return new BufferedReader(new InputStreamReader(con.getInputStream()));

【讨论】:

  • 感谢您的回答。你能写信告诉我如何更改我的 Java 代码以使其正常工作吗?
猜你喜欢
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2010-12-21
  • 2016-01-08
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多