获取源代码 // 文件 reader // returns 空列表
Getting Source code // File reader // returns empty list
我正在尝试制作一个网络抓取工具,收集一年中每天排名前 100 的音乐。目前我正在尝试编写收集源代码的函数。我几乎只是从我的另一个刮板中复制并粘贴它,但出于某种奇怪的原因,它 returns 是一个空列表。
我相信我们正在使用函数 get_source_code 但我可能是错的。不会返回任何错误消息。提前致谢,将不胜感激。
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;
}
}
如果您检查了请求的响应代码:
System.out.println(billboardConnection.getResponseCode());
您会看到它正在返回 301 错误代码(永久移动)。
有时要抓取 URL 返回移动的错误,您需要遵循重定向 URL。但是在这种情况下,如果您检查重定向 URL(存储在位置 header 字段中),您将看到:
http://www.billboard.com/charts/hot-100/2017-02-25
这意味着您的请求正在从 https 降级为 http,因此您只需首先使用 http 即可轻松解决您的问题:
URL link = new URL("http://www.billboard.com/charts/hot-100/2017-02-25");
我正在尝试制作一个网络抓取工具,收集一年中每天排名前 100 的音乐。目前我正在尝试编写收集源代码的函数。我几乎只是从我的另一个刮板中复制并粘贴它,但出于某种奇怪的原因,它 returns 是一个空列表。
我相信我们正在使用函数 get_source_code 但我可能是错的。不会返回任何错误消息。提前致谢,将不胜感激。
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;
}
}
如果您检查了请求的响应代码:
System.out.println(billboardConnection.getResponseCode());
您会看到它正在返回 301 错误代码(永久移动)。
有时要抓取 URL 返回移动的错误,您需要遵循重定向 URL。但是在这种情况下,如果您检查重定向 URL(存储在位置 header 字段中),您将看到:
http://www.billboard.com/charts/hot-100/2017-02-25
这意味着您的请求正在从 https 降级为 http,因此您只需首先使用 http 即可轻松解决您的问题:
URL link = new URL("http://www.billboard.com/charts/hot-100/2017-02-25");