Re: AHK: Скачивание через GET/POST-запросы
А куда это всё загружается? В какую переменную?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
А куда это всё загружается? В какую переменную?
В ту же, в html.
Но как, Холмс?
Видимо, по принадлежности к req, как-то это происходит, могу ошибаться. Потому собственно и предложил себя поправить).
на необходимости чего Malcev настаивал
Сходите ещё раз по указанной ссылке, присмотритесь повнимательнее, какого именно объекта свойство readyState там обсуждается.
Надо так?
While req.document.readyState != "complete"
Sleep, 10
Там на странице ява-скрипт заполняет переменные, вписанные в HTML-код, поэтому нужно ожидание.
req.document
А где вы это взяли? Что за свойство document у этого объекта?
Это я гуглю и вижу, что так это фигурирует в AHK-скриптах.
Пример?
Не стоит текст цитировать скриншотом. Там я вижу код IE.document.readyState, насколько можно понять, IE — это объект InternetExplorer.Application. А у вас, насколько я ещё помню — req := ComObjCreate("MSXML2.XMLHTTP.6.0"). Разве это одно и то же?
Я думал одно и то же. Ведь req тоже можно изменить на самые разные варианты, которые встречаются:
req := ComObjCreate("MSXML2.XMLHTTP.6.0")
HTTP := ComObjCreate("MSXML2.XMLHTTP.6.0")
whr := ComObjCreate("MSXML2.XMLHTTP.6.0")
...
Почему вы так думали, может стоило посмотреть подробнее?
Знаете, у меня предложение. Давайте с этого момента нашим с вами девизом станет:
Л — логика!
Т — терпение!
П — победа!
Сокращённо ЛТП. Вам как? По-моему звучит отлично.
Так думал, потому что упомянутое IE — это такая же изменяемая часть, как и req, HTTP, whr —
obbbIE := ComObjCreate("InternetExplorer.Application")
ComObjConnect(obbbIE, "IE_"), loading := true ; Connect IE object & set var "loading" as TRUE
obbbIE.visible := true
obbbIE.navigate("http://www.ss.lv/ru/real-estate/flats/riga/centre/hand_over/")
While obbbIE.readyState != 4 || obbbIE.document.readyState != "complete" || obbbIE.busy
Sleep, 10
obbbIE.document.querySelector("#f_o_8_min").value := 150
obbbIE.document.querySelector("#f_o_8_max").value := 250
obbbIE.document.querySelector("input[type=""submit""]").click()
while, loading
Sleep, 10
MsgBox, % obbbIE.document.documentElement.OuterHtml
return
IE_DocumentComplete() { ; the "IE_" prefix corresponds to the ComObjConnect() function above
global loading := false ; Break the While-Loop
}
То есть, вместо obbbIE, можно вписать разное. Это к вопросу о логике).
Не, пока не вижу логики в рассуждениях. Вы приводите пример с InternetExplorer.Application в то время как у вас MSXML2.XMLHTTP.6.0. Как назвать переменную для кода нет разницы, главное какой объект она содержит.
Медитируйте над девизом ЛТП!
req.document
А где вы это взяли? Что за свойство document у этого объекта?
Если исходить из вашей постановки вопроса, то всё логично я пояснил). А вообще конечно мне буквы З не хватило в вашем девизе — соответствующих знаний).
Так думаете З — они врождённые должны быть?
конечно мне буквы З не хватило в вашем девизе
Тогда уж сразу ХЗ — но это уже совсем другой девиз.
Так и логика — не врождённая, а приходит с усвоением языка.
Ну да, если под языком вы имеете в виду язык, на котором мы разговариваем, а не язык программирования. Но этот-то этап, я надеюсь, у вас уже пройден, так что теперь для вас Л и Т — это инструменты, с помощью которых вы можете получить З и прийти к П.
Всё-таки, без врожденной логики не дерзну пойти по вашим стопам).
Malcev, кстати, тот случай, когда с IE=edge не работает.
В смысле?
Когда IE=edge, readyState не выходит из "loading", проверял и на семёрке, и на десятке.
А каким кодом ты проверял?
http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
http.Open("GET", "https://gallica.bnf.fr/ark:/12148/btv1b8449039t/?lang=FR", false)
http.Send()
ResponseText := StrReplace(http.ResponseText, "=""/", "=""https://gallica.bnf.fr/")
document := ComObjCreate("htmlfile")
document.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=edge"">")
document.write(ResponseText)
document.close()
loop
{
tooltip % document.ReadyState
sleep 1000
}
У меня в эмуляции IE9 в IE сайт вообще не загружается.
url := "https://gallica.bnf.fr/ark:/12148/btv1b8449039t/?lang=FR"
html := GetHtml(url)
Doc := DocumentFromHtml(html)
while Doc.readyState = "loading"
Sleep, 100
MsgBox, % Doc.readyState
GetHtml(url) {
whr := ComObjCreate("Msxml2.XMLHTTP.6.0")
whr.Open("GET", url, false)
whr.SetRequestHeader("Pragma", "no-cache")
whr.SetRequestHeader("Cache-Control", "no-cache, no-store")
whr.Send()
Return html := whr.ResponseText
}
DocumentFromHtml(html) {
doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
doc.write(html)
Return doc
}
url := "https://gallica.bnf.fr/ark:/12148/btv1b8449039t/?lang=FR"
html := GetHtml(url)
Doc := DocumentFromHtml(html)
while Doc.readyState = "loading"
Sleep, 100
MsgBox, % Doc.readyState
GetHtml(url) {
whr := ComObjCreate("Msxml2.XMLHTTP.6.0")
whr.Open("GET", url, false)
whr.SetRequestHeader("Pragma", "no-cache")
whr.SetRequestHeader("Cache-Control", "no-cache, no-store")
whr.Send()
Return html := whr.ResponseText
}
DocumentFromHtml(html) {
doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=edge"">")
doc.write(html)
doc.close()
Return doc
}
Но так джаваскрипты не подгружаются.
Да вообще-то я особой разницы в выдаче и в том, и в другом случае не заметил. Например вот это
MsgBox, % Doc.querySelector(".textNbPageEtTailleDoc3").innerHtml
получить никак не удаётся.
Наверно, потому что textNbPageEtTailleDoc3 только один раз встречается на странице, в стилях.
А те данные, заполняемые ява-скриптом, как получить-то?
Через хром.
Это который вот так надо запускать?
driver := ComObjCreate("Selenium.ChromeDriver")
Нет.
Так? —
ChromeInst := new Chrome("ChromeProfile")
Да.
То есть, хром должен быть установлен на компе?
Ну а сами как думаете?
Можете и через ie автоматизировать - хотя он намного глючнее.
Просто не у всех может стоять Хром, поэтому IE предпочтительней. А есть пример запуска через IE с отработкой скриптов?
На форуме куча примеров.
Если же вам нужен готовый скрипт, то есть платный раздел.
Нужна ссылка на такой пример, сам я кучу протестировал, но не сработало. Видимо, потому что сам по себе метод неидеален, да и сайт с особенностями, о чём вы с teadrinker`ом выше говорили.
Там нету никаких таких особенностей.
https://developer.mozilla.org/ru/docs/Web/HTTP/CORS
ужна ссылка на такой пример, сам я кучу протестировал, но не сработало
Вам нужна - вы и ищите. Либо нанимайте человека, который за вас будет искать.
Если какой-то код не работает, то надо его привести и спрашивать конкретно по нему.
Я дважды приводил код и спрашивал, что не так).
При чем тут
пример запуска через IE с отработкой скриптов
и ваши приведенные коды, которые не используют IE?
Вы прикалываетесь или действительно не понимаете?
Ну так о том и была речь, чтобы показать как сделать, чтобы приведенные коды использовали IE.
Нанимайте репетитора.
Вот я вначале приводил код с использованием IE —
http://forum.script-coding.com/viewtopi … 58#p145158
Практически такой же потом привел teadrinker —
И где там используется автоматизация ie?
Выше мне приводили поправки именно к коду в таком виде, а о необходимости автоматизации не говорилось. Теперь выясняется, что только она и нужна была).
Могу только процитировать teadrinkerа:
пишите код со смыслом, тогда и вопросы начнут сами собой отпадать.
Сложно писать со смыслом, когда наводящие советы к нему не приближают, а наоборот).
А как правильно вот такой вариант настроить?
#SingleInstance Force
global oHttpRequest := ComObjCreate("MSXML2.XMLHTTP.6.0")
oHtmlDoc := documentFromURL("https://gallica.bnf.fr/ark:/12148/btv1b8449039t/?lang=FR")
out := oHtmlDoc.body.outerText
out := RegExReplace(out, "s).*(<span id=""id_gallicarteSpan"".*?</span>).*", "$1")
MsgBox % out
documentFromURL(ByRef sURL) {
oHttpRequest.open("GET", sURL, false)
oHttpRequest.send()
return documentFromHTML(oHttpRequest.responseText, sURL)
}
documentFromHTML(ByRef sHTMLCode, ByRef sBaseURL) {
oDoc := ComObjCreate("htmlfile")
oDoc.open()
oDoc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
if (oDoc.readyState != 4) ; Not done yet.
return
oDoc.close()
oDoc.body.innerHTML := sHTMLCode
return oDoc
}
Что значит "настроить"? Скрипт — не пианино!
DD, а зачем вы понапихали огрызков различного кода?
Вы хоть понимаете, что они делают?
Malcev, там всего два огрызка с RegEx и readyState, который я запихнул по вашему совету).
teadrinker
Фигурально выражаясь).
Мой совет был писать код обдуманно.
А так вы уже нафлудили почти на 100 сообщений.
Я и писал обдуманно) Согласно советам ожидание поставил, но все это не работает.
По второму кругу пошли...
DD, скажите честно, вы понимаете что означают точечки между словами, такие как тут oDoc.readyState?
Неа.
Ну тогда и не говорите, что пишете обдуманно.
Через ComObjCreate вы создаете объект.
Их много и все они разные.
У каждого объекта есть методы и свойства.
Чтобы их вызвать вы разделяете их точкой.
oDoc := ComObjCreate("htmlfile")
oDoc - объект.
Если мы хотим применить к нему метод open(), то будет так:
oDoc.open()
Если этот метод или свойство что-то возвращает, то мы можем это узнать так:
msgbox % oDoc.readyState
DD За-то честно, красава)
З.ы.
Однажды на работе на одном из собрании я продвигал дальнейшую стратегию развития продукта, по свежим аналитическим данным. И вот в какой-то момент, оперируя цифрами я подошел к кульминации рассказа. И упомянул одно "среднее значение" по выборке, вместо "медианы". И тут кто-то задаёт мне вопрос в лоб, кажется такой банальный: "а в чем разница между средним значением и медианой?". Конечно я догадывался что есть разница, но вот какая именно - не знал. А всё потому, что в аналитике которая приходила ко мне, по стечением обстоятельств эти показатели всегда были почти одинаковые, разница в пределах 0.2%. И за все годы, я не удосужился узнать, в чем же все таки разница. И вот когда мне задали вопрос, я не нашел ничего лучшего, как ответить: "не знаю, но особо никакой разницы и нет". Конечно была гордость за честный ответ, но для меня как для специалиста, это был провал полный=) После собрания первым делом узнал у аналитика, в чем же разница, а главное урок получил на всю жизнь.
Malcev
Ну конечно, я пишу не настолько обдуманно, чтобы было понимание каждой точки — речь была про обдуманно на уровне шаблонов). Кстати, после вашего пояснения вижу, что хоть и не знал, что означает точка, но было понимание необходимости перед ней указывать то, что было объявлено выше в объекте). Тем не менее, вроде указываю ожидание по readyState в нужном месте, но обработки по нему не происходит.
Botsy
В данном случае я, к сожалению или к счастью, не специалист)
Что значит не настолько?
Вы вообще пишите, то чего не понимаете.
И из-за этого у вас постоянно однотипные вопросы.
oDoc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
if (oDoc.readyState != 4) ; Not done yet.
return
1) Что вы здесь ожидаете - когда будет завершена запись директивы X-UA-Compatible?
2) С чего вы взяли что readyState должен возвращать 4?
3) Зачем у вас там return стоит?
За 12 лет можно наверное было найти время и почитать мануал?
"Не настолько" то и значит, что каждый пользовался фрагментами кодов, не понимая их до нюансов, но примерно имея представление, что они делают. При этом конечно допускаю, что могу и по работе этих шаблонов ошибаться, потому что эти варианты приводились по результатам ваших советов, для их коррекции.
1) Когда будет завершена запись директивы, предполагается, что начнется ожидание загрузки страницы (с ява-скриптами и тп).
2) Видел такие примеры в скриптах — мало ли, может и должен возвращать в каких-то случаях.
3) return стоит для возврата к ожиданию загрузки, когда она не произошла.
1) Когда будет завершена запись директивы, предполагается, что начнется ожидание загрузки страницы (с ява-скриптами и тп).
С чего это вдруг?
oDoc.readyState - вернет вам текущий статус страницы и сккрипт пойдет дальше.
Видел такие примеры в скриптах — мало ли, может и должен возвращать в каких-то случаях.
Это тоже самое, что утверждать, что 2*2=5. Мало ли может и будет равно в каких-то случаях.
return стоит для возврата к ожиданию загрузки, когда она не произошла.
У вас что асинхронно страница подгружается?
А как тогда ожидание загрузки страницы прописать?
Перечитать этот топик и немного пораскинуть мозгами.
Уже перечитывал и пораскинул.
Так правильно ожидание прописывать?
While oDoc.readyState != "loading"
Выше вы писали про OuterHtml, но все примеры с ним относятся к "InternetExplorer.Application".
Так правильно ожидание прописывать?
Уже ближе.
Выше вы писали про OuterHtml, но все примеры с ним относятся к "InternetExplorer.Application".
Ну так через него и автоматизируйте.
Мы же показали, что через htmlfile не получается.
То есть, в результате страница будет грузиться в скрытое/видимое окно IE и уже из него извлекаться текст? Выше вы вроде писали, что джаваскрипты не подгружаются с "IE=edge", но не "htmlfile"?
С IE=edge все подгружается.
Там куча скриптов и htmlfile их не выполняет.
Нужна симуляция браузера.
А где выше было сказано, что htmlfile не выполняет эти ява-скрипты? И это вы писали, что с IE=edge джаваскрипты не подгружаются.
Выше вы писали, что это делается "так же как и в автоматизации IE". Хотя оказалось, что кроме автоматизации IE, другого варианта нет.
Я правильно понял, что страница будет грузиться в скрытое или видимое окно IE, с извлечением текста из него?
А где выше было сказано, что htmlfile не выполняет эти ява-скрипты? И это вы писали, что с IE=edge джаваскрипты не подгружаются.
Вы читаете по диагонали?
У меня в эмуляции IE9 в IE сайт вообще не загружается.
Да вообще-то я особой разницы в выдаче и в том, и в другом случае не заметил. Например вот это
MsgBox, % Doc.querySelector(".textNbPageEtTailleDoc3").innerHtml
получить никак не удаётся.
Выше вы писали, что это делается "так же как и в автоматизации IE". Хотя оказалось, что кроме автоматизации IE, другого варианта нет.
Как подождать, чтобы они загрузились и получить outerhtml?
Так же как и в автоматизации IE
Я писал конкретно про синтаксис.
Я правильно понял, что страница будет грузиться в скрытое или видимое окно IE, с извлечением текста из него?
Вот сами и проверьте.
У меня в эмуляции IE9 в IE сайт вообще не загружается
Там ниже вы писали, заменив в коде teadrinkerа "IE=9" на "IE=edge", что так джаваскрипты не подгружаются. И на что teadrinker ответил, что особой разницы нет, приведя пример, что по классу получить данные не удалось. Что значит, что оба метода не стабильные.
Я писал конкретно про синтаксис.
Тем не менее, ваш ответ подразумевал, будто возможен выбор из двух вариантов — будто синтаксис из автоматизации IE, можно переписать под htmlfile. И так как мне постоянно приводили поправки к коду с использованием htmlfile, не говоря, что это сразу надо отбросить — то конечно, дело не шло).
Вот сами и проверьте.
Не хотелось бы опять время тратить на выяснение, потому что с загрузкой страницы в окно (с запуском процесса), мне не подходит. Проще уж распарсить.
Там ниже вы писали, заменив в коде teadrinkerа "IE=9" на "IE=edge", что так джаваскрипты не подгружаются
Если заменить IE=edge на IE=9 - неподгружаются.
Тем не менее, ваш ответ подразумевал, будто возможен выбор из двух вариантов — будто синтаксис из автоматизации IE, можно переписать под htmlfile
Это вы себе так придумали.
Синтаксис там один - разбор DOM.
И так как мне постоянно приводили поправки к коду с использованием htmlfile, не говоря, что это сразу надо отбросить — то конечно, дело не шло
Оно у вас не идет потому что вы не хотите читать мануал, а на форуме уже никому не интересно скачивать ваши книги.
Не хотелось бы опять время тратить на выяснение, потому что с загрузкой страницы в окно (с запуском процесса), мне не подходит. Проще уж распарсить.
Дело хозяйское.
Вот сами и проверьте.
В этом коде используется oIE.navigate()?
Да.
Это вы себе так придумали.
Синтаксис там один - разбор DOM.
Все равно это значило, что разбор DOM можно пробовать получать для htmlfile "так же как и в автоматизации IE".
Если заменить IE=edge на IE=9 - неподгружаются.
А что, без запуска процесса IE можно получать тот текст?
Нет.
Чтобы отправить ответ, вы должны войти или зарегистрироваться