HTML抓取我的身份验证详细信息的网站

时间:2011-02-22 17:09:33

标签: java html authentication web-scraping

所以我使用以下代码来获取特定网址的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());
    }
  }
}

此代码适用于维基百科和其他网站,但对于我的网址却没有。例如:

INPUT:

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

输出:

HTTP / 1.x 403禁止 Set-Cookie:ARPT = LWYYVUShyp1CKIQY;路径= / X-Powered-By:Servlet / 2.5 服务器:Sun GlassFish Enterprise Server v2.1 Set-Cookie:UGROUTE = 4c5e7101a68101c06a712650c7352d98;路径= / P3P:CP =“所有DSP COR CUR ADMA DEVa TAIa PSAa PSDa IVAa IVDa我们的总线UNI COM NAV INT CNT STA PRE” Set-Cookie:UG = zc2qAfg {;路径= / 缓存控制:无存储,无缓存,必须重新验证 Pragma:没有缓存 到期:0 X-Powered-By:JSF / 1.2 X-Powered-By:JSF / 1.2 Content-Type:text / html; charset = UTF-8 内容 - 语言:en-US 转移编码:分块 日期:2011年2月22日星期二16:09:48 GMT 输入/输出错误:服务器返回HTTP响应代码:403为URL:http://ntu-edu-sg.campuspack.eu/Groups/SC207-SOFTWARE_ENGINEERING/WikiCPE207_Template_0/Week_11_Software_Testing

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

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

2 个答案:

答案 0 :(得分:1)

首先,您需要使用真正的全功能HTTPClient来处理重定向,以及在重定向之前设置的身份验证Cookie。您需要一些模仿浏览器正在做的事情。在这种情况下,HttpURLConnection无法为您做到这一点。

开始诊断您需要设置的内容以及如何在Firefox或Tools - >中使用FirebugLiveHttpHeaders等内容的好地方Chrome中的Developer Tools模式可准确查看重定向的工作方式以及重定向的工作方式以及重定向发生时设置和期望可用的Cookie。

答案 1 :(得分:0)

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

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