没有 API 的第三方网站抓取
third party website scraping without API
根据在几个组合框中所做的选择,我需要废弃 this 网站。
问题是没有 API 并且 URL 是常量,所以我无法复制 url 来匹配条件。
我设法使用 firefox 检查器找出 post 命令,
但是在 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());
不起作用。它只有 returns 图形和按钮,但没有实际数据。
当我复制参数并将其粘贴到 firefox 时,就这样
https://gaiacrmkea.c-gaia.gr/city_thessaloniki/index.php?fyear=2015&esex=0&cdief=Όλες
我做对了。
有什么想法吗?
编辑:
我希望每天自动完成。
编辑2:
解决了!
根据 Özhan Düz 提供的代码,我添加了这些
Select type= document
.query("#esex")
.getSelect();
type.setSelectedIndex(1);
type.change();
Select dep =document
.query("#cdief")
.getSelect();
dep.setSelectedIndex(1);
dep.change();
为了获得所有三个组合框。
现在我只需要自动执行即可。
您设置的参数似乎是 GET 而不是 POST:
String urlParameters = "fyear=2015&esex=0&cdief=Όλες";
在您为 post 请求设置时,您可能需要 smth。像这样(见 3-d 行):
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);
您可以使用开源 ui4j web automation library. Download the ui4j-all 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());
}
}
}
根据在几个组合框中所做的选择,我需要废弃 this 网站。 问题是没有 API 并且 URL 是常量,所以我无法复制 url 来匹配条件。
我设法使用 firefox 检查器找出 post 命令,
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());
不起作用。它只有 returns 图形和按钮,但没有实际数据。 当我复制参数并将其粘贴到 firefox 时,就这样 https://gaiacrmkea.c-gaia.gr/city_thessaloniki/index.php?fyear=2015&esex=0&cdief=Όλες
我做对了。
有什么想法吗?
编辑: 我希望每天自动完成。
编辑2: 解决了! 根据 Özhan Düz 提供的代码,我添加了这些
Select type= document
.query("#esex")
.getSelect();
type.setSelectedIndex(1);
type.change();
Select dep =document
.query("#cdief")
.getSelect();
dep.setSelectedIndex(1);
dep.change();
为了获得所有三个组合框。 现在我只需要自动执行即可。
您设置的参数似乎是 GET 而不是 POST:
String urlParameters = "fyear=2015&esex=0&cdief=Όλες";
在您为 post 请求设置时,您可能需要 smth。像这样(见 3-d 行):
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);
您可以使用开源 ui4j web automation library. Download the ui4j-all 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());
}
}
}