Я принял ответ Тима Вандерзейла, потому что он направил меня к инструменту, который мне был нужен для этого.Теперь я хочу поделиться тем, что я сделал, с тем, что он мне дал.Решение является лишь полуавтоматическим из-за проблемы с 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": ""
}
]
}
Возможно, это поможет некоторым людям, которые хотели автоматизировать сохранение страниц. И если кто-то может улучшить это, возможно, вы могли бы сказать, как в комментарии или другого ответа. Особенно, если вы знаете, почему диалоговое окно Сохранить как не закрывается надежно, и знаете, как это исправить.