Ich habe einen Web-Scraper erstellt, der Daten von einer Website kratzt. Problem ist, dass wir von dieser Website die Daten des aktuellen Tages und auch Daten des gesamten Geschäftsjahres sehen können. Was mein Schaber macht, ist nur die Daten des aktuellen Tages zu holen. Ich kann die Daten des ganzen Jahres nicht mitbringen. Zum Beispiel, wenn ich Daten von '01-Juli-2015 'bis heute abrufen möchte, kann mein Schaber nur die Daten der aktuellen Tagesdaten abrufen.
Link: http://www.nccpl.com.pk/market-information/fipi-lipi/fipi unten ist der Bildschirm, der die Daten abgerufen werden müssen. Unten ist mein CodeWie Daten in Bezug auf das Datum zu kratzen
package nccpl_fipi_yearly;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Nccpl_fipi_yearly {
boolean writeCSVToConsole = true;
boolean writeCSVToFile = true;
boolean sortTheList = true;
boolean writeToConsole;
boolean writeToFile;
public static Document doc = null;
public static Elements tbodyElements = null;
public static Elements elements = null;
public static Elements tdElements = null;
public static Elements trElement2 = null;
public static ArrayList<Elements> sampleList = new ArrayList<Elements>();
static int i = 0;
public static void createConnection() throws IOException {
System.setProperty("http.proxyHost", "191.1.1.202");
System.setProperty("http.proxyPort", "8080");
String tempUrl = "http://www.nccpl.com.pk/market-information/fipi-lipi/fipi";
doc = Jsoup.connect(tempUrl).timeout(10000).get();
System.out.println("Successfully Connected");
}
public static void parsingHTML() throws Exception {
File fold = new File("D:\\KSE\\NCCPL-YEARLY.csv");
fold.delete();
File fnew = new File("D:\\KSE\\NCCPL-YEARLY.csv");
for (Element table : doc.getElementsByClass("table")) {
for (Element trElement : table.getElementsByTag("tr")) {
trElement2 = trElement.getElementsByTag("tr");
tdElements = trElement.getElementsByTag("td");
FileWriter sb = new FileWriter(fnew, true);
//if (table.hasClass("marketData")) { //&&(tdElements.hasClass("tableHead")&&tdElements.hasClass("tableSubHead"))
for (Iterator<Element> it = tdElements.iterator(); it.hasNext();) {
if (it.hasNext()&& i>0) {
///sb.append(" | ");
sb.append(" \r\n ");
}
for (Iterator<Element> it2 = tdElements.iterator(); it.hasNext();) {
Element tdElement2 = it.next();
final String content = tdElement2.text().replace(",", "");
if (it2.hasNext()) {
sb.append(formatData(content));
sb.append(" | ");
}
}
System.out.println(sb.toString());
sb.flush();
sb.close();
i++;
}
System.out.println(sampleList.add(tdElements));
}
}
}
private static final SimpleDateFormat FORMATTER_MMM_d_yyyy = new SimpleDateFormat("MMM/dd hh:mm", Locale.US);
private static final SimpleDateFormat FORMATTER_dd_MMM_yyyy = new SimpleDateFormat("MMM-dd hh:mm", Locale.US);
public static String formatData(String text) {
String tmp = null;
try {
Date d = FORMATTER_MMM_d_yyyy.parse(text);
tmp = FORMATTER_dd_MMM_yyyy.format(d);
} catch (ParseException pe) {
tmp = text;
}
return tmp;
}
public static void main(String[] args) throws IOException, Exception {
createConnection();
parsingHTML();
}
}
Es wird nicht funktionieren, wenn Sie zuerst eine 'GET' Anfrage senden und fügen Sie seine Cookies der 'POST' Anfrage hinzu. – TDG
@TDG bist du dir sicher? Es hat für mich funktioniert. –
Nun, ich habe den Datenverkehr des Browsers angeschaut und gesehen, dass nach dem Laden der ersten Seite der Browser die Cookies zusammen mit dem 'POST' sendet, aber wenn Sie sagen, dass es für Sie funktioniert, dann überprüft der Server wahrscheinlich nicht Kekse. – TDG