Тема: AHK: Получение данных с сайта sports.ru
Помогите, пожалуйста, получить информацию из sports.ru о следующем несыгранном матче, а также информацию о последнем сыгранном матче, исключая результат исхода матча. Спасибо!
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Помогите, пожалуйста, получить информацию из sports.ru о следующем несыгранном матче, а также информацию о последнем сыгранном матче, исключая результат исхода матча. Спасибо!
Сообщение вынесено из темы в отдельный топик.
becauseim, пользуйтесь поиском.
На форуме уже много раз обсуждалось, как получить данные с сайтов.
Всё просто.
QueryResponseWebsite(url) ; На вход получает URL. Открывает ссылку URL и в переменную "AnswerWebsite" сохраняет ответ с сайта.
{
global AnswerWebsite
ComObjError(False)
HTTP := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HTTP.SetTimeouts(6000,6000,6000,6000)
HTTP.Open("GET",url)
HTTP.Send()
AnswerWebsite := HTTP.ResponseText
}
sememix, спасибо! Но не понятно, как правильно использовать эту ф-ию.
sememix, функция выдает название вкладки? Как же получить информацию о результате? Т.е. как получить ссылку на строку с результатом?
Я бы хотел попросить конкретный пример, отвечающий, например, на первую половину вопроса, аналогично которому, я бы мог самостоятельно решить вторую его часть.
Сопутствующий вопрос: возможно ли реализовать данный сценарий без видимой активности стандартного браузера? Или же AHK не может получать информацию с сайта в фоновом режиме?
upd.: Нашел пример, который демонстрирует работу в фоновом режиме. Однако по-прежнему, сложным остается определение класса на целевой странице для перебора и извлечения нужной мне информации.
Если сложно определить класс, делайте через регулярные выражения.
Malcev, а вообще, пример из восьмого поста подходит для интересующего меня сайта?
Там мудрёно и кое-что лишнее.
Вот тут проще:
http://forum.script-coding.com/viewtopic.php?pid=111713
Malcev, Спасибо! Правда не из одного примера не понятно, куда помещается класс. Да и сам класс по-прежнему я не установил.
Malcev, дайте, пожалуйста, ссылку на пост из предложенного топика, пример из которого наиболее подходит.
Malcev, какие строки из примера по второй ссылке подлежат редактированию? Не понятно, где необходимо указывать класс.
Алгоритм прост. Открыл в браузере ( в моём случае хром ) страницу сайта. Нажал F12, чтобы вызвать панель разработчика. Кликнул по значку лупы, а потом на интересующий меня блок на странице. В окне с деревом html тэгов раскрылся тот который я искал. Из кода я выяснил, что у ячейки установлен только classname, значит придётся искать по нему, что я и сделал в скрипте. Механику парсинга и отбора тэгов я позаимствовал у HTML DOM Document. Вот вроде бы и всё.
https://msdn.microsoft.com/en-us/library/ms535862
https://www.w3schools.com/jsref/dom_obj_document.asp
Всем доброго здоровья!
А как быть, если нужная разметка страницы загружается в ответ на клик по элементу формы? Например, на страницу загружаются скрипты со стилями и форма кнопки "Продолжить" и только после нажатия этой кнопки вместо формы её описывающей загружается остальная разметка страницы(с ботами борются). Как правило, выглядит такая форма везде шаблонно:
; ---- разметка до кнопки
<Form method="POST" action=''>
<input type="hidden" name="op" value="view">
<input type="hidden" name="id" value="cpfc7kzch2b1">
<input type="hidden" name="pre" value="1">
<input type="submit" name="next" value="Продолжить">
</Form>
; ---- разметка после кнопки
В "Tampermonkey" у меня простенький сценарий, который просто сообщает клик элементу с атрибутом "name" равному "next". Но тут нельзя отправить клик вроде:
oHtmlDoc.getElementsByName("next")[0].click()
Здесь, нужно отправить запрос и получить ответ, верно? Потому как такое дело открывает пустую страницу в "IE", а текст в "oHtmlDoc" остаётся без изменений.
Подскажите пожалуйста методу. Весь вечер увлечён этой темой, но решение не приходит. По ссылкам примеров, уводящим по пути рассуждения ознакомился с заполнением формы и авторизацией, да как-то методом тыка, без должного опыта не приманстырить знания, чтобы этот велосипед из костылей мог хотя бы не разваливаться.
Посмотрите,, что броузер отправляет при нажатии этой кнопки и тоже самое отправляйте в своем пост запросе через WinhttpRequest.
Отлично, работает!
Правда теперь, если я правильно понимаю, встал камнем заморочь с куками. Строки имеющие место быть в ответе на запрос из браузера:
<script language="JavaScript" type="text/javascript" CHARSET="UTF-8" src="/js/jquery.cookie.js"></script>
<script>
$.cookie('file_id', '13349000', { expires: 10 });
$.cookie('file_code', 'rb6p1oxubsl9', { expires: 10 });
</script>
и остальная, следующая за ними разметка основного контента, отсутствует в тексте ответа, получаемого от запроса из сценария. Прямо в аккурат так, будто середина вырезана, а в остальном текст идентичен.
С этим можно что-то сделать?
Куки тоже можно отправлять.
SetRequestHeader("Cookie", ....)
http://forum.script-coding.com/viewtopi … 87#p107787
Но так сходу сложно сказать в чем причина.
Может какой-то параметр упустили в пост запросе, ай-ди или токен.
Благодарю! Вечером попробую разобраться.
becauseim, не думаю, что имеет смысл дублировать в приват просьбу из топика, как не считаю, что Вас игнорируют. Вероятнее всего, заданный вопрос малоинформативен, или слишком неконкретен, чтобы искать к нему определения более, чем их освещают примеры из этого обсуждения. Попробуйте получить текст страницы, чтобы понимать, что с этим делать дальше:
Gui, +HWNDHandle
Gui, Add, Edit, w1200 h800
Gui, Show, Hide
link := "https://www.sports.ru/barcelona/calendar/"
req := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
req.Open("GET", link, false)
req.Send()
text := req.responseText
ControlSetText,Edit1,%text%,ahk_id%Handle%
Gui, Show
Текст в "Edit" будет содержать все знаки из разметки страницы, но может некорректно их отображать. Скопируйте его и вставьте в Ваш редактор. Так будет проще изучать то, что пришло ответом на запрос. Так же, пользуйтесь вкладкой "Network" по клавише "F12" в браузере "Chrome", или "Сеть", в расширении "FireBug" для "FireFox". Там отображается детальная информация о запросах со страницы. Ну и почитать соответствующую литературу конечно же стоит. Да и мне пожалуй тоже, потому как я такой же "деревянный" в этом вопросе и как всегда, больше надежд возлагаю на метод "научного тыка" вместо того, чтобы уделить этому должное внимание, раз уж мне так интересно.
KusochekDobra, Спасибо! К сожалению, в Edit после запуска скрипта не содержится ничего, поэтому, не понимаю, как это использовать и понимать. Думаю, вопрос достаточно информативен, а конкретного решения не поступает в связи с надежой на то, что зацеплюсь за примеры. И вроде бы, Malcev предложил методику работы над элементами веб-страницы, но пока я всеже не понимаю, с чего надо начинать. Подумаю.
Прошу прощения, мне показалось очевидным, что это такой же шаблон, что и прочие среди примеров.
#SingleInstance Force
#NoEnv
DetectHiddenWindows, On
Gui, +HWNDHandle
Gui, Add, Edit, w1200 h800
Gui, Show, Hide
link := "https://www.sports.ru/barcelona/calendar/"
req := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
req.Open("GET", link, false)
req.Send()
text := req.responseText
ControlSetText,Edit1,%text%,ahk_id%Handle%
Gui, Show
return
GuiClose:
ExitApp
Так будет работать.
но пока я всеже не понимаю, с чего надо начинать.
Начните с прочтения:
http://ermak.cs.nstu.ru/webprog/webprog.pdf
Тут надо регулярными выражениями вытягивать нужную информацию. Сам я не знаю их, можно по нужным буквам достать информацию, но вместе с текстом, идет код HTML.
link := "https://www.sports.ru/"
req := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
req.Open("GET", link, false)
req.Send()
text := req.responseText
MsgBox % StringBetween(text,"С","ей")
StringBetween( String, NeedleStart, NeedleEnd="" ) {
StringGetPos, pos, String, % NeedleStart
If ( ErrorLevel )
Return ""
StringTrimLeft, String, String, pos + StrLen( NeedleStart )
If ( NeedleEnd = "" )
Return String
StringGetPos, pos, String, % NeedleEnd
If ( ErrorLevel )
Return ""
StringLeft, String, String, pos
Return String
}
return
svoboden, спасибо! Так понимаю, в Вашем примере не указан конкретный класс или тег страницы, для получения по нему информации? В какую строку необходимо его вводить? Прокомментируйте, пожалуйста, пятую строку.
becauseim, надо регулярными выражениями по тегам вытягивать информацию. А здесь, ни по тегам, а по нужным символам находит информацию.
Совсем необязательно использовать регулярные выражения, хотя с ними быстрее.
Можно через HTMLFile.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться