用Java进行屏幕抓取

时间:2013-12-07 20:28:05

标签: java screen-scraping

我正在尝试创建一个用java编写的应用程序,它使用我的大学课程搜索功能。我正在使用一个简单的http get请求,其代码如下:

public static String GET_Request(String urlToRead) {

    java.net.CookieManager cm = new java.net.CookieManager();
    java.net.CookieHandler.setDefault(cm);

    URL url;
    HttpURLConnection conn;
    BufferedReader rd;
    String line;
    String result = "";

    try {

        url = new URL(urlToRead);     
        conn = (HttpURLConnection) url.openConnection();    
        conn.setRequestMethod("GET");
        rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        while ((line = rd.readLine()) != null) {
           result += line;
    }

    rd.close();

    } 
    catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

但它没有用。

这是我要抓的网址: https://webapp4.asu.edu/catalog/classlist?c=TEMPE&s=CSE&n=100&t=2141&e=open&hon=F

我试着查看jsoup,但是当我去尝试jsoup选项卡并获取网址时,它会得到与get请求相同的结果。

我在http get请求和jsoup中得到的重复失败的结果是,它会显示大学的搜索页面,而不是实际的类和有关它们是否打开的信息。

我最终寻找的是一种刮取网站的方法,该网站显示课程是否有开放席位。一旦我得到网页的内容,我就可以解析它,我只是没有得到任何好的结果。

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要添加Cookie来回答初始课程提问:

  

课程搜索课程目录
  指出您希望看到的课程   * ASU校园
  * ASU Online

您只需添加

即可
conn.setRequestProperty("Cookie", "onlineCampusSelection=C");

HttpURLConnection

我使用Google Chrome的开发人员工具(Ctrl-Shift-I)找到了该Cookie,然后查看了Resources标签,然后展开了Cookies以查看webapp4.asu.edu Cookie。

以下代码(主要是您的代码)获取您要查找的页面的HTML:

public static void main(String[] args) {
    System.out.println(download("https://webapp4.asu.edu/catalog/classlist?c=TEMPE&s=CSE&n=100&t=2141&e=open&hon=F"));
}

static String download(String urlToRead) {
    java.net.CookieManager cm = new java.net.CookieManager();
    java.net.CookieHandler.setDefault(cm);
    String result = "";
    try {
        URL url = new URL(urlToRead);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Cookie", "onlineCampusSelection=C");

        BufferedReader rd = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
            result += line + "\n";
        }
        rd.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

虽然,我会使用像jsoupHTML Parser这样的真正解析器来执行实际的解析工作。