Ich schreibe ein Spider-Programm in Java und ich stieß auf einige Probleme bei der URL-Umleitung. Es gibt zwei Arten der URL-Umleitung, in die ich bisher gelaufen bin, die erste ist die mit HTTP-Response-Code 3xx, die ich beachten kann, folgen this answer.Crawl durch JavaScript-Umleitung
Aber die zweite Art ist, dass der Server Rückkehr HTTP-Antwortcode 200 mit einer Seite, die nur einig JavaScript-Code wie folgt enthalten:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script>
function detectmob() {
var u=(document.URL);
if(navigator.userAgent.match(/Android/i) || some other browser...){
window.location.href="web/mobile/index.php";
} else {
window.location.href="web/desktop/index.php";
}
}
detectmob();
</script>
</head>
<body></body></html>
Wenn die ursprüngliche URL http://example.com ist, dann wird es automatisch umleiten zu http://example.com/web/desktop/index.php, wenn ich einen Desktop-Webbrowser mit aktiviertem JavaScript verwende.
jedoch meine Spinne prüft HttpURLConnection#getResponseCode()
zu sehen, ob es die endgültige URL erreicht hat durch HTTP response code 200
bekommen und nutzen URLConnection#getHeaderField()
das Location
Feld zu bekommen, wenn HTTP response code 3xx
empfangen wird. Im Folgenden ist der Code-Schnipsel meiner Spinne:
public String getFinalUrl(String originalUrl) {
try {
URLConnection con = new URL(originalUrl).openConnection();
HttpURLConnection hCon = (HttpURLConnection) con;
hCon.setInstanceFollowRedirects(false);
if(hCon.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM
|| hCon.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) {
System.out.println("redirected url: " + con.getHeaderField("Location"));
return getFinalUrl(con.getHeaderField("Location"));
}
} catch (IOException ex) {
System.err.println(ex.toString());
}
return originalUrl;
}
So bekommt die oben genannte Seite ein HTTP response code 200
hat und meine Spinne wird einfach davon ausgehen, es wird keine weitere Umleitung sein und starten Sie die Seite Syntaxanalyse, die in Begriff ist leer von Inhaltstext.
Ich habe Google dieses Problem ein wenig und anscheinend ist javax.script
irgendwie verwandt, aber ich habe keine Ahnung, wie man es funktioniert. Wie kann ich meine Spinne so programmieren, dass sie die richtige URL erhält?