用 Java 编写脚本,定期从网站请求数据
Posted
技术标签:
【中文标题】用 Java 编写脚本,定期从网站请求数据【英文标题】:Writing a script in Java that regularly requests data from a website 【发布时间】:2013-01-28 14:40:42 【问题描述】:我正在开展一个项目,该项目要求我使用加拿大边境巡逻队在其website 上提供的边境等待时间信息来构建等待时间分布的可视化表示。
我正在尝试找到一种方法,让 Java 脚本定期检查网站,并在几个不同的边境站(不是全部)提取信息。我想我会使用 XPath 来获取特定的站点,但是如何定期加载网页?
(PS 我知道他们现在也有 Twitter 帐户,但他们每天更新一次,更具体地说,我想学习如何使用网站和 XPATH)
【问题讨论】:
基本上你必须使用计时器代码来实现 AJAX。使用 jQuery 库很容易实现。如果有相关网站的 API 访问权限,AJAX 将为您工作。否则,您必须构建一些后端解决方案来从该网站抓取数据 您的意思是 javascript,而不是 Java,对吗?如果是这样,请修复标签。 【参考方案1】:好的,我今天在工作中休息了一点,想提供帮助并为您写下它。请原谅我第一次解析网站时出现任何错误,我做了一些研究并决定为此使用 jSoup。
好的,这段代码将解析表格并用值将 3 列系统化,您可以更改代码并根据需要构建它:)
你必须下载jsoup jar Download jSoup
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
/**
*
*/
public class ParseWithJsoup
public static void main(String[] args)
URL url;
try
url = new URL("http://www.cbsa-asfc.gc.ca/bwt-taf/menu-eng.html");
URLConnection conn = url.openConnection();
BufferedReader buffRead = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer buffer = new StringBuffer("");
String inputLine = "";
// Append the site in a buffer
while (inputLine != null)
inputLine = buffRead.readLine();
buffer.append(inputLine);
Document doc = Jsoup.parse(buffer.toString());
// Parse the table
Element table = doc.select("table[class=bwt]").first();
//Office elements iterator
Iterator<Element> officeElements = table.select("td[headers=Office]").iterator();
//Commercial Flow iterator
Iterator<Element> comElements = table.select("td[headers=Com ComCanada]").iterator();
//Travellers Flow iterator
Iterator<Element> travElements = table.select("td[headers=Trav TravCanada]").iterator();
// Iterate all elements through first element row for all columns
while(officeElements.hasNext())
System.out.println("Office: " + officeElements.next().text());
System.out.println("Commercial Flow: " + comElements.next().text());
System.out.println("Travellers Flow: " + travElements.next().text());
catch (Exception e)
System.out.println("Exc:"+e.getMessage());
`
【讨论】:
【参考方案2】:在 Java 中使用 URL。创建 URL,然后使用其方法 .openConnection() 开始从网站读取。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class webVisitor
public static void main(String[] args)
URL url;
try
url = new URL("http://seinfeldaudio.com");
URLConnection conn = url.openConnection();
BufferedReader buffRead = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine = "";
while (inputLine != null)
inputLine = buffRead.readLine();
System.out.println(inputLine);
catch (Exception e)
更多信息在这里:http://www.mkyong.com/java/how-to-get-url-content-in-java/
【讨论】:
所以您回答了自己的问题并选择了它作为答案? 无论如何,您还需要某种推送机制来使用新数据更新 UI。您可能还想查看 Comet 推送通知。 @happybuddha 基本上。我花了很长时间才得到答案,所以我拿出一本书,想出了大部分。 *** 欢迎 OP 回答他们自己的问题。 2 月 28 日我为您的问题 OP 给出了确切答案,我什至已经对其进行了测试并解析了数据,您的答案是关于如何读取 html 数据并打印它们的通用答案,您问过用于 XPATH 解析,但你的问题是你的答案:) @ThomasSofras 我真的很感谢你的回答,但我接受了我的答案,因为我已经完成了研究并在你的答案出现之前发布了我的答案。尽管如此,出于欣赏,并且因为你的回答实际上更好,我会改变我的接受:)【参考方案3】:看起来像使用 setInterval("function()",x)
的 Ajax
参考这个问题-Repeat jQuery ajax call
我还没来得及学习 node.js 但这看起来很适合它
【讨论】:
【参考方案4】:使用DWR (Easy Ajax for Java),通过设置时间间隔从你的java脚本调用DWR方法
setInterval(DWR function here , millisec, lang)
在 Java 方法中使用 java.net.URL 类根据需要读取和解析内容。
【讨论】:
以上是关于用 Java 编写脚本,定期从网站请求数据的主要内容,如果未能解决你的问题,请参考以下文章