Вам не нужно открывать эту книгу в браузере. Единственное, что вам нужно, это скопировать ссылку, назначенную кнопке. Так как он не добавляется JavaScript, его можно просто извлечь из исходного кода веб-сайта.
Вам действительно нужен ответ здесь: Как отправить HTTP-запрос в java?
Таким образом, шаги будут такими:
- Загрузка веб-сайта по URL-адресу, который у вас есть.
- Поиск URL-адреса PDF-файла с книгой на загруженном веб-сайте.
- Загрузите файл, используя полученный URL-адрес.
Чтобы извлечь ссылку с загруженного веб-сайта, вы можете использовать регулярные выражения. Уже есть сообщение об этом.
Чтобы загрузить файл в Java, вы можете сделать это так:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
class Main {
public static void downloadFile(URL url, String outputFileName) throws IOException {
try(InputStream in = url.openStream();
ReadableByteChannel rbc = Channels.newChannel(in);
FileOutputStream fos = new FileOutputStream(outputFileName))
{
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
}
}
public static void main(String[] args) throws Exception {
// call to downloadFile() method
}
}
Я взял это решение у здесь .
Это может показаться немного другим, чем нажатие на кнопку , но это так, как это должно быть сделано, потому что это намного быстрее. Если вы автоматизируете эти действия с помощью браузера, вы потеряете больше ресурсов, поскольку вам придется запускать отдельный экземпляр, например, Firefox. Время загрузки заняло бы больше времени, вместе с загрузкой и рендерингом всей графики и других материалов, не связанных с тем, что вы в итоге хотите. Кроме того, загрузка файла с использованием встроенного браузера диспетчера загрузки может быть сложной. В любом случае, если вы хотите изучить еще несколько техник, позволяющих вам напрямую взаимодействовать с элементами сайта, взгляните на Selenium .
Этот пример будет в BASH, но я пишу это только для того, чтобы дать вам представление о загрузке веб-сайта и извлечении из него значений. Вы можете сделать это на Java или любом другом языке.
Загрузить веб-сайт:
wget -O website.html http://link.springer.com/openurl\?genre\=book\&isbn\=978-0-306-48048-5
Я хотел найти какую-то уникальную вещь, которая бы идентифицировала кнопку, и, например, я взял data-track-action="Book download - pdf"
атрибут. Я использовал его, просматривая загруженный веб-сайт:
cat website.html | grep 'data-track-action="Book download - pdf"'
<a href="/content/pdf/10.1007%2Fb100747.pdf" target="_blank" class="c-button c-button--blue c-button__icon-right test-download-book-options test-bookpdf-link" title="Download this book in PDF format" rel="noopener" data-track="click" data-track-action="Book download - pdf" data-track-label="">
<a href="/content/pdf/10.1007%2Fb100747.pdf" target="_blank" class="c-button c-button--blue c-button__icon-right test-download-book-options test-bookpdf-link" title="Download this book in PDF format" rel="noopener" data-track="click" data-track-action="Book download - pdf" data-track-label="">
Как видите, есть 2 строки вывода. Они одинаковы, поэтому грязным исправлением для этого будет команда uniq
:
cat website.html | grep 'data-track-action="Book download - pdf"' | uniq
<a href="/content/pdf/10.1007%2Fb100747.pdf" target="_blank" class="c-button c-button--blue c-button__icon-right test-download-book-options test-bookpdf-link" title="Download this book in PDF format" rel="noopener" data-track="click" data-track-action="Book download - pdf" data-track-label="">
Вы можете просто взять только первую строку.
Теперь, используя некоторое регулярное выражение, путь к PDF может быть извлечен:
cat website.html | grep 'data-track-action="Book download - pdf"' | uniq | grep -o '\/content.*\.pdf'
/content/pdf/10.1007%2Fb100747.pdf
Чтобы подключить домен, мы можем сделать эхо с частью ссылки, и обернуть другую часть с $()
для оценки команд:
echo "https://link.springer.com"$(cat website.html | grep 'data-track-action="Book download - pdf"' | uniq | grep -o '\/content.*\.pdf')
https://link.springer.com/content/pdf/10.1007%2Fb100747.pdf
И чтобы использовать результат в wget, мы можем сделать что-то вроде этого:
wget $(echo "https://link.springer.com"$(cat website.html | grep 'data-track-action="Book download - pdf"' | uniq | grep -o '\/content.*\.pdf'))
Таким образом, окончательный код будет выглядеть следующим образом:
wget -O website.html "http://link.springer.com/openurl?genre=book&isbn=978-0-306-48048-5"
wget $(echo "https://link.springer.com"$(cat website.html | grep 'data-track-action="Book download - pdf"' | uniq | grep -o '\/content.*\.pdf'))