使用 jsoup 查询搜索小部件

Query a search widget using jsoup

我想查询以下站点并将所有结果保存到 csv 文件中:

http://services2.hdb.gov.sg/webapp/BB33RTIS/BB33SSearchWidget

我已经有了这个程序(这是以前的程序员写的,我正在尝试理解代码,因为我是 jsoup 和网络爬虫的初学者),但现在网站更新了,查询没有更长的作品。我想我需要更新 URL。下面是我目前使用的 url 字符串:

private final static String URL = "http://services2.hdb.gov.sg/webapp/BB33RTIS/BB33SSearchWidget?"
        + "client=default"
        + "&proxystylesheet=default"
        + "&output=xml_no_dtd"
        + "&Process=continue"
        + "&FLAT_TYPE=%s"
        + "&NME_NEWTOWN=%s"
        + "&NME_STREET="
        + "&NUM_BLK_FROM="
        + "&NUM_BLK_TO="
        + "&AMT_RESALE_PRICE_FROM="
        + "&AMT_RESALE_PRICE_TO="
        + "&DTE_APPROVAL_FROM=%s"
        + "&DTE_APPROVAL_TO=%s";

然后我这样连接:

Document doc = Jsoup.connect(url).get();

我想更新它以使用新的 URL。我检查了页面源,但找不到它。谁能帮我找到我需要在这里传递的 URL f 。

要了解站点的工作方式,您可以打开 FirebugChrome 开发人员工具 和检查网络流量。在那里您可以检查通过网络发送的内容(数据、GETPOST、cookies,...)。

对于此网站,您需要 post 数据,但您还需要设置一些 cookie,否则该网站将不会接受您的 POST请求。您可以通过先发送 GET 请求并读取 cookies 来做到这一点:

Response res = Jsoup
    .connect("http://services2.hdb.gov.sg/webapp/BB33RTIS/BB33SSearchWidget")
    .timeout(10000) // edit: set timeout to 10 seconds
    .method(GET)
    .execute();

Map<String,String> cookies = res.cookies();

现在您可以使用 cookies 发送您的 POST 请求:

Document doc = Jsoup
   .connect("http://services2.hdb.gov.sg/webapp/BB33RTIS/BB33SSearchWidget")
   .timeout(10000) // edit: set timeout to 10 seconds
   .data("FLAT_TYPE", "02")
   .data("NME_NEWTOWN", "BD      Bedok")
   .data("NME_STREET", "")
   .data("NUM_BLK_FROM", "")
   .data("NUM_BLK_TO", "")
   .data("dteRange", "12")
   .data("DTE_APPROVAL_FROM", "Apr 2015")
   .data("DTE_APPROVAL_TO", "Apr 2016")
   .data("AMT_RESALE_PRICE_FROM", "")
   .data("AMT_RESALE_PRICE_TO", "")
   .data("Process", "continue")
   .cookies(cookies)
   .post();

并使用 doc 抓取搜索结果。

注意:使用 URL 编码的 数据发送 GET 请求对我不起作用