java - Java中的屏幕抓取

标签 java screen-scraping

我正在尝试创建一个用 java 编写的应用程序,它使用我的大学类(class)搜索功能。我正在使用带有以下代码的简单 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

我通过 http get 请求和 jsoup 得到的反复失败的结果是,它打开了大学的搜索页面,但没有打开有关它们是否开放的实际类(class)和信息。

我最终要寻找的是一种抓取显示类(class)是否有空位的网站的方法。一旦我获得网页的内容,我就可以解析它,但我没有得到任何好的结果。

谢谢!

最佳答案

您需要添加一个 cookie 来回答最初的类(class)设置问题:

class search course catalog
Indicate which course offerings you wish to see
* ASU Campus
* ASU Online

你只需添加

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

HttpURLConnection

我使用 Google Chrome 的开发者工具 (Ctrl-Shift-I) 找到了 cookie,并查看了 Resources 选项卡,然后展开 Cookies 以查看 webapp4。 asu.edu cookies。

以下代码(大部分是您的代码)获取您要查找的页面的 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做实际的解析工作。

关于java - Java中的屏幕抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20446230/

相关文章:

java - Spring Boot + Spring Data Multi-Tenancy

vba - 屏幕抓取 - 通过几个标签名称向下查找类名称

php - PHP 的抓取库 - phpQuery?

python - 如何使用 Splinter 查找元素值?

php - 简单的PHP屏幕抓取功能

java - 隐藏类的实例变量

将 Bean 列表传递给 Oracle 存储过程的 Java 程序 - 一次性传递整个列表,而不是一个接一个地附加对象

java - JVM 中的多线程——它们什么时候使用多核?

java - android中的聊天应用程序,以便发送者和接收者消息应该在不同的一边

app-store - iTunes的AppStore出现问题