Как автоматизировать сохранение веб-страниц? - PullRequest
0 голосов
/ 03 января 2019

Мне нужно заархивировать несколько сотен веб-страниц в стиле, который браузеры называют «Сохранить как, завершить», то есть они сохраняют HTML-файл для самой страницы вместе с папкой, полной других файлов, необходимых для правильного отображения страницы, например как CSS, JS и файлы изображений. Это позволяет просматривать страницы в автономном режиме, выглядя так же, как при отображении в Интернете.

Вот методы, которые я пробовал, и проблемы с каждым из них:

  • Ручной процесс в Firefox :

    • По ссылке для следующей страницы щелкните правой кнопкой мыши. Введите «A» в поле «Сохранить местоположение ссылки», чтобы скопировать целевой URL в буфер обмена.
    • Нажмите на ссылку, чтобы перейти на страницу.
    • Введите «Alt-F-A» для «Сохранить страницу как». Если он еще не выбран, установите для параметра «Сохранить как тип» значение «Веб-страница завершена».
    • Если его там еще нет, наведите курсор на «Имя файла». Введите «Ctrl-Insert», чтобы вставить буфер обмена, содержащий URL-адрес текущей страницы.
    • Переместите курсор в конец URL-адреса, затем переместите его назад, пока он не достигнет последнего символа «/». Выберите оттуда слева, чтобы выбрать часть пути URL.
    • Нажмите «Удалить», чтобы удалить путь из URL, оставив только имя файла.
    • Нажмите «Enter» на клавиатуре или «Ok» в диалоговом окне.
    • Страница теперь сохранена. Повторите процесс, нажав на ссылку для следующей страницы. (Предполагается, что на каждой странице есть ссылка «Далее», что верно для страниц, которые я архивирую. Если бы это было не так, то был бы дополнительный шаг, чтобы вернуться на страницу со списком всех ссылок и щелкнуть следующий оттуда.)

    Это довольно утомительно делать снова и снова. Это процесс, который я хочу автоматизировать.

  • iMacros . Этот тип повторяющихся задач - именно то, для чего нужны макросы. Ранее я использовал iMacros для аналогичных задач в веб-браузере, но долгое время не использовал его. Я переустановил его, выяснил, как его использовать снова, и написал макрос, состоящий из одной или двух строк, чтобы сохранить текущую страницу с именем ее URL-адреса. Затем, когда я попытался запустить его, iMacros сообщил мне, что команда SaveAs недоступна в бесплатной версии, и мне нужно перейти на версию за 100 долларов (с 30-дневной бесплатной пробной версией), чтобы получить эту возможность. Меня не впечатлило то, что я увидел в текущей версии программного обеспечения, и я обнаружил, что оно неуклюже и плохо документировано. Поэтому я предпочел искать другое решение.

  • Wget . Это очень круто. Википедия описывает ее как «компьютерную программу, которая извлекает контент с веб-серверов». Это было новым для меня, и потребовалось время, чтобы понять. В основном это приложение для Unix, оно также доступно для Windows и представляет собой небольшой исполняемый файл, который не требует установки. Я выучил его достаточно, чтобы загрузить несколько тестовых страниц, но когда я зашел на страницы, которые мне нужно заархивировать, это не сработало на них. Я отправил электронное письмо в список рассылки Wget о проблеме и жду, когда смогу разобраться с какой-нибудь помощью. (Связанная электронная почта имеет командную строку Wget, которую я использовал, включая URL-адрес страницы, которую я хочу заархивировать, с вложенными файлами изображений того, как страница выглядит в Интернете и после сохранения Wget.)

    Редактировать: Более недели спустя в списке рассылки Wget не было ответа.

  • Селен .Хотя в этом говорится не о построении макросов, а о «тестовых случаях». , похоже, что система макросов гораздо более высокого качества, чем iMacros.Я попробовал это.Но я обнаружил, что он не записывает все, что мне нужно сделать в процедуре под Ручной процесс в Firefox выше.Например, когда я щелкнул правой кнопкой мыши ссылку и набрал «A», чтобы сохранить связанный URL-адрес, Selenium не добавил ничего в алгоритм, который записывал.После перехода по ссылке, когда я сохранил страницу, Selenium снова ничего не сделал.Так что, хотя оно выглядит как качественное программное обеспечение, оно, похоже, не обладает необходимыми мне возможностями, если только я что-то не так понимаю.

Так что я в замешательстве.Я не собираюсь делать этот ручной процесс несколько сотен раз.Поэтому мне нужно найти способ автоматизировать это.Как я могу это сделать?

1 Ответ

0 голосов
/ 05 января 2019

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

Во-первых, позвольте мне упомянуть некоторые предысториитехнология, которая интересна. Kantu , и особенно его расширение XModules (что мне было нужно для этого проекта), довольно новы.Компания, которая их производит, была основана в 2016 году , а Kantu была объявлена ​​в сентябре 2017 года .Но их история намного глубже этой истории, поскольку ее основателями являются Матиас Рот , первоначальный разработчик iMacros .Kantu - это другая реализация другого инструмента, который я упоминал в своем вопросе, Selenium .Так что в этой эзотерической области автоматизации браузеров происходит много перекрестного опыления.

Многие люди уже давно спрашивают в StackOverflow, как автоматизировать сохранение веб-страниц, например, 1 , 2 , 3 , 4 , 5 и 6 .Ни один из ответов не кажется мне таким уж полезным.Это немного странно, потому что все браузеры имеют такую ​​возможность, поэтому для этого должны быть где-то плавающие модули, поэтому я не знаю, почему я не могу просто вызвать для него функцию в PHP.Вопрос, связанный как # 5 выше, говорит, что он появляется в браузерах через " Webkit ", но, зная, что это еще ни к чему мне не привело, полезно.

Итак, втем временем, пока я не найду эту функцию PHP, мне придется сделать это, превратив мой веб-браузер в робота.Я разработал приведенный ниже код для нескольких электронных книг за платным экраном, для которых у меня есть законная учетная запись и которую я хочу сохранить для автономного использования, но которые не предлагаются в формате PDF.Я определил два способа загрузки страниц с помощью Kantu:

  • Я помассировал HTML-код страниц содержания, чтобы извлечь необходимые URL-адреса и поместить их в файлы CSV.Это можно прочитать по команде Канту csvRead.URL-адрес передается команде open, чтобы открыть страницу, затем команда XType отправляет Ctrl-S (или Alt-F-A), чтобы сообщить браузеру о необходимости сохранить страницу.XType используется снова, чтобы ввести имя файла для сохранения как (часть URL после последнего "\"), а окончательный XType отправляет Enter, чтобы закрыть диалоговое окно браузера Save-As.Зациклите это, и книга будет сохранена.Цикл может быть выполнен либо внутри макроса с использованием метки и команды gotoLabel, либо макрос может быть записан на одной странице, а цикл может быть выполнен в графическом интерфейсе Канту.

  • Кроме того, я могу использовать ссылки на каждой странице, чтобы перейти на следующую страницу.Это процесс, который я описал в своем вопросе.Сначала я использовал процесс записи Канту, чтобы получить ссылку на следующую страницу и использовать ее в качестве данных в коде для макроса ниже (в частности, в качестве «цели» команд XClick и click).Я запускаю Kantu на первой веб-странице, и макрос использует команду XClick, чтобы щелкнуть правой кнопкой мыши ссылку на следующую страницу, а затем XType, чтобы отправить «A» в браузер и попросить скопировать связанный URL-адрес в буфер обмена.Затем команда click щелкает ссылку, чтобы открыть страницу, а остальное остается тем же, что и в предыдущем методе.Здесь я использую ссылки на следующую страницу, чтобы получить URL-адреса вместо файла CSV.

Теперь я упомянул, что в Канту есть проблема, которая не позволяет полностью автоматизировать ее. Последний шаг процесса, отправка Enter в браузер для закрытия диалогового окна «Сохранить как», является нестабильной по неизвестным причинам. Иногда это работает, а иногда просто сидит диалоговое окно, требующее, чтобы я сам нажал Enter, чтобы позволить процессу перейти к следующей веб-странице. Это утомительно и означает, что мне нужно участвовать в процессе, а не оставлять его самостоятельно. Таким образом, не идеально, но гораздо лучше, чем выполнять всю остальную процедуру вручную, что было бы невозможно для нескольких сотен страниц.

Бесплатная версия XModules имеет ограничение в 25 команд на запуск. Для преодоления этого лимита взимается единовременная плата в размере 50 . Это, вероятно, стоило бы того, если бы я мог позволить процессу работать самостоятельно. Но так как мне все равно приходится присматривать за ребенком, я сейчас запускаю макрос, нажимая кнопку Play macro Канту для каждой страницы, а также отслеживаю, когда мне нужно нажать Enter.

Я написал о проблеме Enter и некоторых других проблемах на форуме Канту. Их команда была очень отзывчивой и полезной. Я надеюсь, что я или они, или кто-то, читающий это, могут найти решение. Между тем, полуавтоматический процесс лучше, чем ничего.

Между двумя описанными выше методами только второй, использующий ссылки на следующую страницу для получения URL-адресов, может работать без цикла, то есть с ручным нажатием Play macro для каждой страницы. Так что это тот, который я использовал сейчас. Код имеет довольно нечеткое повторение 25 Ctrl-Left с в качестве обходного пути для неожиданного отсутствия клавиши Home в словаре XType, а также отсутствия (насколько я нашел) команда для повторного нажатия клавиши.

Вот код Канту в формате JSON:

{"Name": "SavePageAsComplete",
 "CreationDate": "2019-01-03",
 "Commands":
  [{"Command": "comment",
    "Target":  "Macro for Kantu with XModules. Based on demo macros DemoXClick and 
         DemoXType and docs https://a9t9.com/kantu/docs/xclick and https://a9t9.com/kantu/docs/xtype. 
         The target in the XClick and click commands are what was obtained from 
         attempting to record this macro on the website, which resulted in only an open 
         command and two identical click commands with that target.",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Set play speed to 0.3 seconds. (See Kantu manual section 'Setting the right macro replay speed'.)",
    "Value":   ""
    },
   {"Command": "store",
    "Target":  "medium",
    "Value":   "!replayspeed"
    },
   {"Command": "bringBrowserToForeground",
    "Target":  "",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Right-click the link for the next page and copy its URL to the clipboard.",
    "Value":   ""
    },
   {"Command": "XClick",
    "Target":  "//*[@id=\"container\"]/div[2]/section/div[2]/a/div",
    "Value":   "#right"
    },
   {"Command": "XType",
    "Target":  "A",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Click the link for the next page. (Tried with 'clickAndWait' instead in 
         order to wait for the page to load, but that yielded error 'No page load 
         event detected after 10 seconds.')",
    "Value":   ""
    },
   {"Command": "click",
    "Target":  "//*[@id=\"container\"]/div[2]/section/div[2]/a/div",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Open the Save-as dialog.",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_CTRL+KEY_S}",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Wait for the dialog to appear.",
    "Value":   ""
    },
   {"Command": "pause",
    "Target":  "2000",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Paste the clipboard (URL of now-current page) into Filename text box.",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_CTRL+KEY_V}",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Move the cursor to the beginning of the URL. (There is no Home key!)",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}${KEY_CTRL+KEY_LEFT}",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Select from the beginning of the URL to the end of its path part.",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}${KEY_SHIFT+KEY_CTRL+KEY_RIGHT}",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Delete the selection, leaving just the filename.",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_DEL}",
    "Value":   ""
    },
   {"Command": "pause",
    "Target":  "500",
    "Value":   ""
    },
   {"Command": "comment",
    "Target":  "Save the page.",
    "Value":   ""
    },
   {"Command": "XType",
    "Target":  "${KEY_ENTER}",
    "Value":   ""
    }
   ]
 }

Возможно, это поможет некоторым людям, которые хотели автоматизировать сохранение страниц. И если кто-то может улучшить это, возможно, вы могли бы сказать, как в комментарии или другого ответа. Особенно, если вы знаете, почему диалоговое окно Сохранить как не закрывается надежно, и знаете, как это исправить.

...