没有API的第三方网站抓取

时间:2015-04-03 08:03:01

标签: java web-scraping

根据在几个组合框中所做的选择,我需要废弃this网站。 问题是没有API且URL是常量,因此我无法复制网址以符合条件。

我使用firefox检查器设法找出post命令, enter image description here  但在java程序中使用它时:

String url = "  https://gaiacrmkea.c-gaia.gr/city_thessaloniki/index.php";
    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    //add reuqest header
    con.setRequestMethod("POST");
    con.setRequestProperty("Accept-Language", "el-GR,el;q=0.8,en-US;q=0.5,en;q=0.3");
    String urlParameters = "fyear=2015&esex=0&cdief=Όλες";
    // Send post request
    con.setDoOutput(true);
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.flush();
    wr.close();

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'POST' request to URL : " + url);
    System.out.println("Post parameters : " + urlParameters);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine+"\n");

    }
    in.close();

    //print result
    System.out.println(response.toString());

不起作用。它只返回图形和按钮,但没有真实数据。 当我复制参数并将其粘贴到Firefox时,就这样 https://gaiacrmkea.c-gaia.gr/city_thessaloniki/index.php?fyear=2015&esex=0&cdief=Όλες

我说得对。

任何想法?

编辑: 我希望每天都能自动完成。

EDIT2: 解决了! 根据ÖzhanDüz提供的代码,我添加了这些

Select type= document
                .query("#esex")
                .getSelect();
            type.setSelectedIndex(1);
            type.change();

            Select dep =document
                    .query("#cdief")
                    .getSelect();

            dep.setSelectedIndex(1);
            dep.change();

以获得所有三个组合框。 现在我只需要自动执行此操作。

2 个答案:

答案 0 :(得分:4)

您可以使用开源{{3d}}网络自动化库。下载ui4j jar并使用 Java 8 运行示例。

package test;

import java.util.List;

import com.ui4j.api.browser.BrowserEngine;
import com.ui4j.api.browser.BrowserFactory;
import com.ui4j.api.browser.Page;
import com.ui4j.api.dom.Document;
import com.ui4j.api.dom.Element;
import com.ui4j.api.dom.Select;

public class WebScraping {

    public static void main(String[] args) throws InterruptedException {
        BrowserEngine webkit = BrowserFactory.getWebKit();

        // load the page
        Page page = webkit.navigate("https://gaiacrmkea.c-gaia.gr/city_thessaloniki/index.php");
        page.show();

        // get the DOM
        Document document = page.getDocument();

        // find the year combobox
        Select year = document
                        .query("#fyear")
                        .getSelect();

        // select year 2011
        year.setSelectedIndex(0);
        // trigger the change event
        year.change();

        // Small delay before the page load
        Thread.sleep(2000);

        // find the data table
        Element table = document
                            .query("#example")
                            .query("tbody");

        // iterate all rows
        List<Element> rows = table.queryAll("tr");
        for (int i = 0; i < rows.size(); i++) {
            Element row = rows.get(i);

            // iterate all columns
            List<Element> cells = row.queryAll("td");

            StringBuilder builder = new StringBuilder();
            for (int j = 0; j < cells.size(); j++) {
                Element cell = cells.get(j);
                String text = cell.getText();
                builder.append(text).append(" ");
            }

            System.out.println(builder.toString());
        }
    }
}

答案 1 :(得分:0)

您为GET设置了参数,而不是POST:

  

String urlParameters =“fyear = 2015&amp; esex = 0&amp; cdief =Όλες”;

在设置发布请求时,您可能需要smth。像这样(见三维线):

con.setRequestMethod("POST");
con.setRequestProperty("Accept-Language", "el-GR,el;q=0.8,en-US;q=0.5,en;q=0.3");
con.setRequestParameters(<parameters' array>); // "fyear=2015&esex=0&cdief=Όλες" as an array
con.setDoOutput(true);