#java #download #web-scraping #wget #sourceforge
#java #Скачать #очистка веб-страниц #wget #sourceforge
Вопрос:
В настоящее время я работаю над проектом по извлечению исходного кода из SourceForge. Я хотел бы загрузить архив из репозитория кода.
Пример ссылки приведен ниже:http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar
Проблемы, с которыми я столкнулся при загрузке, заключаются в том, что я не могу использовать обычные API URLConnection, HttpClient, HtmlUnit, Jsoup и т.д. Для загрузки файла. Указанная ссылка не содержит никакого имени файла или расширения, это еще больше усложняет процесс загрузки.
Можете ли вы предложить средство, с помощью которого, учитывая набор ссылок на архив в качестве параметров, я смогу загрузить их на свой диск? Кроме того, я смог загрузить его с помощью wget. Есть ли способ, которым я могу программно сделать это на Java в Windows?
Комментарии:
1. Почему вы не можете использовать стандартную библиотеку Java для загрузки файла? Что касается имени файла, просто дайте ему случайное имя и
.tar
расширение. Вы можете создать случайное имя файла с помощью этого:Long.toHexString(Double.doubleToLongBits(Math.random()));
( исходный код).2. Ознакомьтесь также с этими условиями использования .
3. Можете ли вы указать, почему вы не можете использовать «обычный URL, http, htmlunit, API jsoup и т.д.» Для загрузки файла? Совместное использование кода, который завершается ошибкой, поможет любому лучше понять вашу проблему.
4. Кстати, имя файла присутствует в заголовке Content-Disposition ответа (для предоставленной ссылки). Вам нужно проанализировать этот заголовок, чтобы получить желаемое имя файла (которое также отображается браузером в диалоговом окне сохранения файла).
Ответ №1:
Прежде чем вы продолжите свои усилия, внимательно прочитайте страницу Условий использования Sourceforge. Если вы не понимаете ToS, свяжитесь с Sourceforge и спросите их, разрешено ли вам делать то, что вы предлагаете.
Проблемы, с которыми я столкнулся при загрузке, заключаются в том, что я не могу использовать обычные URL, http, htmlunit, jsoup API и т.д. Для загрузки файла.
Ваше предположение неверно.
Для выполнения подобных задач вы можете использовать API, такие как стандартный HttpURLConnection
API или Apache HttpClient
APIs. Если он не работает, это потому, что
- вы делаете что-то неправильно (например, вы не настроили свое Java-приложение на использование вашего локального HTTP-прокси), или
- Sourceforge использует некоторые технические средства, чтобы помешать вам делать это; смотрите ToS.
Если вы опубликуете некоторые подробности о том, что происходит, когда вы пробуете эти подходы, возможно, мы сможем вам помочь.
(HtmlUnit и Jsoup, вероятно, неуместны, поскольку они предназначены для содержимого HTML.)
Указанная ссылка не содержит никакого имени файла или расширения, это еще больше усложняет процесс загрузки.
Вы можете получить исходное имя файла и / или тип содержимого из заголовков ответа. Обратитесь к спецификациям HTTP для получения подробной информации.
Ответ №2:
В случае, если вы действительно хотите, возможно, нарушить ToS SourceForges, это может помочь.
Вам нужно wget.exe , как вы и хотели.
ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
Process p = pb.start();
Это будет работать до тех пор, пока у вас есть wget.exe в том же каталоге, что и файл класса.
Вы также можете захотеть проверить, существует ли файл, и в этом случае вам следует сделать что-нибудь из следующих строк:
ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
Process p = pb.start();
int exitValue = p.waitFor();
BufferedReader reader;
// System.out.println("Exit Value" exitValue);
if (exitValue == 0) {
reader = new BufferedReader(new InputStreamReader(p
.getInputStream()));
} else {
reader = new BufferedReader(new InputStreamReader(p
.getErrorStream()));
}
StringBuffer sb = new StringBuffer();
String temp = reader.readLine();
while (temp != null) {
sb.append(temp);
temp = reader.readLine();
}
reader.close();
System.out.println(sb.toString());
if(sb.toString().indexOf("404") != -1) {
//means that the file does not exist
System.out.println("File does not exist, or access is denied");
} else {
if(sb.toString().indexOf("200") != -1) {
//file exists, download it
System.out.println("File exists, downloading...");
ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
Process p = pb.start();
}
Но я рекомендую НЕ очищать SourceForge, если только вы не очищаете свой собственный код (я сделал это однажды в качестве программы обновления). Если вы это сделаете, и мой пример поможет, пожалуйста, не упоминайте меня. =]
Надеюсь, я помог!