java - 发出发布请求时无法从 jsoup 获取结果

标签 java c# .net jsoup scrape

这是代码片段,它总是返回错误页面

    try {
        String url = "http://kepler.sos.ca.gov/";
        Connection.Response response = Jsoup.connect(url)
                .method(Connection.Method.GET)
                .execute();

        Document responseDocument = response.parse();

        Element eventValidation = responseDocument.select("input[name=__EVENTVALIDATION]").first();
        Element viewState = responseDocument.select("input[name=__VIEWSTATE]").first();
        response = Jsoup.connect(url)
                .data("__VIEWSTATE", viewState.attr("value"))
                .data("__EVENTVALIDATION", eventValidation.attr("value"))
                .data("ctl00_content_placeholder_body_BusinessSearch1_TextBox_NameSearch", "escrow")  // <- search 
                .data("ctl00_content_placeholder_body_BusinessSearch1_RadioButtonList_SearchType", "Corporation Name")
                .data("ctl00_content_placeholder_body_BusinessSearch1_Button_Search", "Search")

                .method(Connection.Method.POST)
                .followRedirects(true)
                .execute();
        Document document = response.parse(); //search results
        System.out.println(document);

    } catch (IOException e) {
        e.printStackTrace();
    }

我从 Firebug 的网络面板收到了请求响应并发送了相同的请求。 我错过了什么吗?

最佳答案

根据您的 Android 版本,如果您尝试直接通过单击按钮或类似操作来运行该代码,该代码将给出“NetworkOnMainThreadExcpetion”。在 honeycomb 或更高版本上,您必须从单独的显式线程或 AsyncTask 进行网络访问。

根据我的调试,需要添加一些cookie。这包括在下面。另外,您的几个表单字段缺少美元符号,并且传递了一些空白表单字段,它们是空的,但服务器可能期望,所以我也包含了这些字段。

为了将来的引用,我推荐工具 Fiddler如果您尚未使用它,则可以调试此类问题。

class DownloadFilesTask extends AsyncTask<Void, Integer, Long> {
    protected Long doInBackground(Void... params) {
        long totalSize = 0;

        try {
            String url = "http://kepler.sos.ca.gov/";
            Connection.Response response = Jsoup.connect(url)
                    .method(Connection.Method.GET)
                    .execute();

            Document responseDocument = response.parse();
            Map<String, String> loginCookies = response.cookies();


            Element eventValidation = responseDocument.select("input[name=__EVENTVALIDATION]").first();
            String validationKey = eventValidation.attr("value");

            Element viewState = responseDocument.select("input[name=__VIEWSTATE]").first();
            String viewStateKey = viewState.attr("value");

            response = Jsoup.connect(url)
                    .cookies(loginCookies)
                    .data("__EVENTTARGET", "")
                    .data("__EVENTARGUMENT", "")
                    .data("__LASTFOCUS", "")
                    .data("__VIEWSTATE", viewStateKey)
                    .data("__VIEWSTATEENCRYPTED", "")
                    .data("__EVENTVALIDATION", validationKey)
                    .data("ctl00$content_placeholder_body$BusinessSearch1$TextBox_NameSearch", "aaa")  // <- search
                    .data("ctl00$content_placeholder_body$BusinessSearch1$RadioButtonList_SearchType", "Corporation Name")
                    .data("ctl00$content_placeholder_body$BusinessSearch1$Button_Search", "Search")

                    .method(Connection.Method.POST)
                    .followRedirects(true)
                    .execute();
            Document document = response.parse(); //search results
            System.out.println(document);

        } catch (IOException e) {
            e.printStackTrace();
        }

        return totalSize;
    }

    protected void onProgressUpdate(Integer... progress) {
    }

    protected void onPostExecute(Long result) {
    }
}

您实际上可以使用以下方式执行该代码:

TestAsyncTask t = new TestAsyncTask();
t.execute();

要获取第 2 页,您必须包含以下标题。这是伪代码,显然,您必须将其转换为 .data 调用:

__EVENTTARGET = ctl00$content_placeholder_body$SearchResults1$GridView_SearchResults_Corp
__EVENTARGUMENT = Page$2

并且您仍然需要其他 header (__VIEWSTATEENCRYPTED 空白,__VIEWSTATE 如上所述)和 cookie 如上所述。

关于java - 发出发布请求时无法从 jsoup 获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30943477/

相关文章:

.net - 如何使 TableLayoutPanel 中的所有列自动调整为完全相同的宽度?

java - 部署报错Unable to compile class for JSP

c# - 在 ASP.NET Core 依赖注入(inject)中使用工厂模式

c# - 来自用户浏览器的网络请求

asp.net - 使用 Azure 上的现有数据库部署 ASP MVC 应用程序

.net - NAnt:如何获取在命令行上指定的目标名称

java - 在字符数组中查找整数平均值

java - 有效数字字符串上的 NumberFormatException

java - 解析树中节点的深度

c# - 为插件架构动态加载程序集