Могу ли я автоматизировать процесс загрузки с URL? - PullRequest
0 голосов
/ 30 апреля 2020

Что я хочу сделать, так это открыть ссылки, подобные этой:

http://link.springer.com/openurl?genre=book&isbn=978-0-306-48048-5

Есть страница книги, и я хочу ее скачать Для этого нужно нажать кнопку «Скачать книгу в формате PDF», после чего книга откроется в браузере и оттуда, наконец, загрузить ее.

Как вы можете видеть, есть еще шаги:

  1. необходимо получить заголовки со ссылками из файла Excel
  2. нужно открыть ссылки, затем получить по ссылке с кнопки, чтобы перейти к pdf-версии книги
  3. необходимо сохранить книгу из pdf-файла на компьютер.

Я нашел учебные пособия по шагам 1 и 2, так что я думаю, что я справлюсь здесь, но ничего для шага № 2. Можете ли вы помочь мне? Я принимаю предложения и для других шагов.

Я хочу сделать это в Java, второй вариант будет C / C ++, а третий python. Мне не нужен полный код, только библиотеки, идеи, примеры кода.

Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2020

Вам не нужно открывать эту книгу в браузере. Единственное, что вам нужно, это скопировать ссылку, назначенную кнопке. Так как он не добавляется JavaScript, его можно просто извлечь из исходного кода веб-сайта.

Вам действительно нужен ответ здесь: Как отправить HTTP-запрос в java?

Таким образом, шаги будут такими:

  1. Загрузка веб-сайта по URL-адресу, который у вас есть.
  2. Поиск URL-адреса PDF-файла с книгой на загруженном веб-сайте.
  3. Загрузите файл, используя полученный 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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...