使用 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 。
要了解站点的工作方式,您可以打开 Firebug 或 Chrome 开发人员工具 和检查网络流量。在那里您可以检查通过网络发送的内容(数据、GET 或 POST、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 请求对我不起作用
我想查询以下站点并将所有结果保存到 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 。
要了解站点的工作方式,您可以打开 Firebug 或 Chrome 开发人员工具 和检查网络流量。在那里您可以检查通过网络发送的内容(数据、GET 或 POST、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 请求对我不起作用