2017-08-03 1 views
0

Ich versuche einen Web-Scraper zu erstellen, der die Top-100-Musik für jeden Tag des Jahres sammelt. Im Moment versuche ich, die Funktion zu schreiben, die den Quellcode sammelt. Ich habe es einfach kopiert und eingefügt von meinem anderen Schaber, aber aus irgendeinem seltsamen Grund gibt es eine leere Liste zurück.Quellcode abrufen // Dateireader // gibt leere Liste zurück

Ich glaube, wir arbeiten mit der Funktion get_source_code, aber ich könnte falsch liegen. Es werden keine Fehlermeldungen zurückgegeben. Hilfe wäre sehr dankbar im Voraus.

import java.util.ArrayList; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.util.List; 
import javax.net.ssl.HttpsURLConnection; 
import java.io.BufferedReader; 
import java.io.IOException; 

public class MusicScraper { 
    public static void main(String [] args)throws IOException { 
     parse_source_code(get_source_code("","","")); 

    } 
    public static List<String> get_source_code(String day, String month, String year)throws IOException{ 
     List <String> sourceC = new ArrayList<>(); 

     URL link = new URL("https://www.billboard.com/charts/hot-100/2017-02-25");    //"http://www.billboard.com/charts/hot-100/" + year + "-" + month + "-" + day); 

     HttpsURLConnection billboardConnection = (HttpsURLConnection) link.openConnection(); 
     billboardConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 
     billboardConnection.connect(); 

     BufferedReader in = new BufferedReader(new InputStreamReader(billboardConnection.getInputStream())); 

     String inputLine; 
     while ((inputLine = in.readLine()) != null) { 
      sourceC.add(inputLine); 
     } 
     System.out.println(sourceC); 
     return sourceC; 
    } 

    public static List<String> parse_source_code(List<String> sourceCode){ 
     List<String> data = new ArrayList<>(); 

     List<String> rank = new ArrayList<>(); 
     List<String> song = new ArrayList<>(); 
     List<String> artist = new ArrayList<>(); 

     for (int i = 0; i < sourceCode.size(); i++) { 
      if (sourceCode.get(i).contains("data-songtitle=\"")) { 
       String parsedSong = sourceCode.get(i).split("data-songtitle=\"")[1].split("\">")[0]; 
       song.add(parsedSong); 
      } 

} 
     System.out.println(song); 
     return sourceCode; 
    } 
} 

Antwort

1

Wenn Sie den Antwortcode zu Ihrer Anfrage überprüft:

System.out.println(billboardConnection.getResponseCode()); 

Sie würden sehen, dass es eine 301-Fehlercode zurückgibt (Dauerhaft verschoben).

Manchmal, um eine URL zu scrapen, die einen verschobenen Fehler zurückgibt, müssten Sie der Weiterleitungs-URL folgen. In diesem Fall jedoch, wenn Sie die Umleitungs-URL überprüfen (im Location-Header-Feld gespeichert) Sie sehen würden:

http://www.billboard.com/charts/hot-100/2017-02-25 

Dies bedeutet, dass das Ihre Anfrage von https zu http herabgestuft wird, und so kann man leicht lösen Ihr Problem nur mit http an erster Stelle:

URL link = new URL("http://www.billboard.com/charts/hot-100/2017-02-25"); 
+0

Dies macht Sinn, danke. Obwohl es Sinn macht, erhalte ich jetzt eine neue Fehlermeldung, weil es kein https ist, wie im Code angegeben, welchen Code ich hinzufügen oder entfernen müsste. – Jblue

+0

Egal, ich habe es zu arbeiten, danke, du bist so sehr. – Jblue

+0

@Jblue möchten Sie 'HttpURLConnection' anstelle von' HttpsURLConnection' verwenden. – explv

Verwandte Themen