首页 > 解决方案 > 为什么通过查看源代码获取 html 代码与使用 Java 代码不同?

问题描述

我正在尝试通过以下代码获取 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 源代码不同。不知是什么原因?也许它与某些网站上的某些特殊安全性有关?谢谢你的帮助。

标签: javahtmlweb-scraping

解决方案


有一个答案,即通常称为“专有握手”和“专有服务器”。可以做的不多,但是有一些方法可以增加服务器的 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()));

推荐阅读