【问题标题】:HTML scraping a website whose authentication details I haveHTML 抓取我拥有其身份验证详细信息的网站
【发布时间】:2011-02-22 17:09:32
【问题描述】:

所以我使用下面的代码来获取特定url的html源代码:

import java.io.*;
import java.net.*;

public class SourceViewer {

  public static void main (String[] args) throws IOException{
    System.out.print("Enter url of local for viewing html source code: ");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String url = br.readLine();
    try{
      URL u = new URL(url);
      HttpURLConnection uc = (HttpURLConnection) u.openConnection();
      int code = uc.getResponseCode();
      String response = uc.getResponseMessage();
      System.out.println("HTTP/1.x " + code + " " + response);
      for(int j = 1; ; j++){
        String header = uc.getHeaderField(j);
        String key = uc.getHeaderFieldKey(j);
        if(header == null || key == null)
          break;
        System.out.println(uc.getHeaderFieldKey(j) + ": " + header);
      }
      InputStream in = new BufferedInputStream(uc.getInputStream());
      Reader r = new InputStreamReader(in);
      int c;
      while((c = r.read()) != -1){
        System.out.print((char)c);
      }
    }
    catch(MalformedURLException ex){
      System.err.println(url + " is not a valid URL.");
    }
    catch(IOException ie){
      System.out.println("Input/Output Error: " + ie.getMessage());
    }
  }
}

此代码适用于 wikipedia 和其他网站,但对于我的 url 它不适用。例如:

输入:

输入查看html源码的本地url:http://ntu-edu-sg.campuspack.eu/Groups/SC207-SOFTWARE_ENGINEERING/WikiCPE207_Template_0/Week_11_Software_Testing

输出:

HTTP/1.x 403 禁止 设置 Cookie:ARPT=LWYYVUShyp1CKIQY;路径=/ X-Powered-By:Servlet/2.5 服务器:Sun GlassFish Enterprise Server v2.1 设置 Cookie:UGROUTE=4c5e7101a68101c06a712650c7352d98;路径=/ P3P: CP="ALL DSP COR CUR ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS UNI COM NAV INT CNT STA 预” 设置 Cookie:UG=zc2qAfg{;路径=/ 缓存控制:无存储、无缓存、必须重新验证 Pragma:无缓存 过期:0 X-Powered-By: JSF/1.2 X-Powered-By: JSF/1.2 内容类型:text/html;charset=UTF-8 内容语言:en-US 传输编码:分块 日期:格林威治标准时间 2011 年 2 月 22 日星期二 16:09:48 输入/输出错误:服务器返回 HTTP 响应代码:403 用于 URL:http://ntu-edu-sg.campuspack.eu/Groups/SC207-SOFTWARE_ENGINEERING/WikiCPE207_Template_0/Week_11_Software_Testing

响应代码 403 表示服务器拒绝我抓取权限。我确实有登录所需的身份验证详细信息,如果我尝试从浏览器访问 url,则会弹出一个窗口,要求我重定向到父站点。我想知道是否有某种方法可以从我的代码中弹出这个窗口。

为了规避身份验证问题,我尝试从浏览器登录,然后在我仍然登录时运行代码。但是,在运行代码时,我得到了相同的输出。这让我很困惑,因为在登录后将 url 复制粘贴到浏览器的另一个选项卡中不会询问身份验证详细信息,而只是显示数据,这意味着我已经拥有权限。有人可以告诉我如何抓取网址吗?

【问题讨论】:

    标签: java html authentication web-scraping


    【解决方案1】:

    首先,您需要使用真正的全功能HTTPClient 来处理重定向,以及它在重定向之前设置的身份验证cookie。您需要模拟浏览器正在执行的操作。在这种情况下,HttpURLConnection 将无法为您执行此操作。

    开始诊断您需要设置的内容以及如何在 Firefox 中使用 FirebugLiveHttpHeaders 或在 Chrome 中使用 Tools -> Developer Tools 模式的好地方,以查看确切的标题以及如何使用重定向正在工作,它正在设置什么 cookie,并期望在重定向发生时可用。

    【讨论】:

      【解决方案2】:

      您正在尝试使用非常简单的抓取程序来模拟浏览器。 为了让您在服务器上进行身份验证,您需要使用诸如HTTPClient 之类的库在登录页面上提交表单。然后,您需要维护您的会话详细信息,以便您向网站发出的每个请求都可以用来识别您经过身份验证的程序。

      使用浏览器登录网站然后尝试使用该程序将不起作用,因为用于识别您身份的浏览器私人详细信息(在使用浏览器时)将不同于用于识别您的详细信息程序。

      【讨论】:

        猜你喜欢
        • 2019-01-27
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多