【问题标题】:Query a search widget using jsoup使用 jsoup 查询搜索小部件
【发布时间】:2016-04-26 09:02:11
【问题描述】:

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

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

我已经有一个程序(它是由以前的程序员编写的,我正在尝试理解代码,因为我是 jsoup 和网络爬虫的初学者),但现在网站已更新,查询不再有效.我想我需要更新网址。下面是我目前使用的 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。

【问题讨论】:

  • 你知道当前的url是什么吗?您是在问如何实现文档的更新或如何更改此 url?
  • 我已包含当前 URL。我在问如何更改网址。谢谢。

标签: java web-crawler jsoup


【解决方案1】:

要了解网站的工作方式,您可以打开 FirebugChrome 开发者工具 并检查网络流量。在那里,您可以检查通过网络发送的内容(数据、GETPOST、cookie 等)。

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

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 请求对我不起作用

【讨论】:

  • 谢谢@nyname00。我尝试了您的代码,但随后出现“包连接不存在”错误。我添加了“importorg.jsoup.Connection.Response;导入 org.jsoup.Connection.Method;”我也将我的 jsoup 版本从 1.7.2 更新到了 1.9.1。
  • @gishara 很奇怪,你不应该从错误的导入中得到 package xyz does not exist,而是 import xyz cannot be resolved。你如何编译你的程序?顺便说一句,我在 1.9.1 上使用import static org.jsoup.Connection.Method.GET;import org.jsoup.Connection.Response;
  • 感谢@nyname00。我正在使用maven编译程序。
  • @gishara maven 编译对我有用。没有更多信息很难说,但这看起来你的类路径在某种程度上是不正确的。您可以直接在 IDE 中编译/运行代码吗?
  • 感谢 nyname00 的回复。我无法在我的 IDE (eclipse) 中编译该程序。 :(
猜你喜欢
  • 2014-06-29
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多