用 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 编写脚本,定期从网站请求数据的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用请求库在网站上搜索特定文本?

用java如何通过api数据接口调用数据

请求动作脚本中的程序

通过请求从受密码保护的网站获取数据

WebSockets 还是定期 Ajax 请求? [复制]

用shell脚本批量进行xss跨站攻击请求