Что нового

[Сеть, интернет] Цикличный переход по ссылкам и страницам

kseniya

Новичок
Сообщения
21
Репутация
1
Ребята подскажите, как мне реализовать мой замысел: как перебирать и просматривать ссылки на странице, если гиперссылки такие:
<a class="одинаковый у всех, кот. мне нужны" href="разный" ...> есть еще tabindex="2"(он либо с таким значением у всех либо его вообще нет)
захожу на яндекс, набираю слово в строке поиска, отображается результат поиска - это получилось
Код:
Работа со строкой поиска в яндексе и перебор ссылок
#include <IE.au3>
$oText = "seleniumHQ" ; текст в строке поиска
$oIE =_IECreate("http://yandex.ru"); открываем яндекс
$oForm = _IEFormGetCollection ($oIE, 0) ; получаем коолекцию всех элементов формы
$oSearch = _IEFormElementGetObjByName($oForm, 0) ; найти 'элемент формы для строки поиска ;(найдена по номеру формы = 0 на странице )
_IEFormElementSetValue($oSearch, "seleniumHQ") ; ввести в сторку поиска текст
_IEFormSubmit($oForm, 0); отправляем форму на сервер
_IELoadWait($oIE) ; ждём загрузки ; по умолчанию ждет загрузки страницы 5 мин.




далее надо , чтоб открывал ссылки в каком-то порядке на определенное время и закрывал их, а , проходя по всей странице переходил на следующую страницу, а потом вновь возвращелся на первую и все по кругу

думаю может далее использовать каким-то образом
Код:
$oLinks = _IELinkGetCollection($oIE); получаем коллекцию ссылок в документе
_IELinkClickByIndex($oLinks, tabindex)

но tabindex они одинаковые
или
Код:
If WinExists("[CLASS:IEFrame]") Then; проверка наличия указанного окна; CLASS:IEFrame - класс она IE
    WinActivate("[CLASS:IEFrame]"); отобразить окно на переднем плане экрана
    $oIE = _IEAttach("http://yandex.ru/yandsearch?", "URL"); присоединить к уже открытому окну IE, в кот. строка поиска уже имеет совпадение по искомому значению 
Else
    $oIE = _IENavigate($oIE, "http://ru.wikipedia.org/wiki/Selenium"); открыть окно
EndIf
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
kseniya,
Попробуйте так
Код:
#include <IE.au3>
#include <Array.au3>
HotKeySet('{Esc}', '_Exit')
$j = 0
Dim $aLinks[$j + 1][2]
$sUrl = 'http://www.google.ru/search?hl=ru&source=hp&q=autoit&aq=f&aqi=g10&aql=&oq=&gs_rfai='
$sSearch = 'autoitscript.com'

$oIE = _IECreate($sUrl)
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
	If StringInStr($oLink.href, $sSearch) Then
		$j += 1
		ReDim $aLinks[$j + 1][2]
		$aLinks[$j][0] = $oLink.innertext
		$aLinks[$j][1] = $oLink.href
	EndIf
Next
$aLinks[0][0] = $j
_ArrayDisplay($aLinks)
$j = 1
While 1
	ToolTip('№ ' & $j & ' - текст: ' & $aLinks[$j][0] & @CRLF & 'ссылка: ' & $aLinks[$j][1], 0, 0)
	_IENavigate($oIE, $aLinks[$j][1])
	$j += 1
	If $j = $aLinks[0][0] Then
		$j = 1
	EndIf
	;тут можно делать со страницей то, что Вам надо
	Sleep(3000)
WEnd

Func _Exit()
	_IEQuit($oIE)
	Exit
EndFunc   ;==>_Exit
 
Автор
K

kseniya

Новичок
Сообщения
21
Репутация
1
madmasles, я так понимаю, что
Код:
Dim $aLinks[$j + 1][2]; j - строк и 2 - столбца

Код:
StringInStr($oLink.href, $sSearch) берет строку со с адресом(т.е. href) ссылки и ищет в ней


Код:
For $oLink In $oLinks
If StringInStr($oLink.href, $sSearch) Then
        $j += 1
        ReDim $aLinks[$j + 1][2]; изменить размер массива
        $aLinks[$j][0] = $oLink.innertext
        $aLinks[$j][1] = $oLink.href
    EndIf
цикл заполняет пустой массив данными, тут вопросы:
1.в $oLink.innertext, что такое innertext
2.и зачем нужен ReDim
идем дальше $aLinks[0][0] = $j
Код:
]_ArrayDisplay($aLinks); отобразим одномерный массив в окне сообщений
отобразить окно с заполненым массивом

While 1, т.е. не совсем понимаю зачем здесь 1..
в цикле While происходит перебор всехссылок по строкам j и первому столбцу

Код:
If $j = $aLinks[0][0] Then
        $j = 1
    EndIf - это условие перехода опять к первой строке, пропуская заголовок массива
 верно ли??


ToolTip('№ ' & $j & ' - текст: ' & $aLinks[$j][0] & @CRLF & 'ссылка: ' & $aLinks[$j][1], 0, 0)
; отобразить окно подсказки на экране.
появлялось только одно окно с выведенным массивом


Как обратится к элементу массива?? так можно $oLink.href или только так $aLinks[$j][1]??
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
{CodeWarn.SModer}
 
Автор
K

kseniya

Новичок
Сообщения
21
Репутация
1
пример хороший!
но в моем случае в href нет повторяющегося текста (мне надо не внутри одного сайта лазить, а зайти на све имеюшиеся ссылки на нескольких страницах).


Добавлено:
Сообщение автоматически объединено:

madmasles, интегрировала ваш пример и свои наброски!!Вывод окна с подсказкой вижу...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
kseniya
Попробуйте так, вроде все прокомментировал:
Код:
#include <IE.au3>
#include <Array.au3>

HotKeySet('{Esc}', '_Exit'); выход по кнопке Esc
$j = 0 ;счетчик найденных ссылок
Dim $aLinks[$j + 1][2];массив, в котором будут храниться найденные ссылки

$sSearch = 'kseniya';слово, которое будем искать

$oIE = _IECreate('http://yandex.ru');открываем IE
$oForm = _IEFormGetCollection($oIE, 0);получаем форму
$oSearch = _IEFormElementGetObjByName($oForm, 'text') ;получаем объект по имени
_IEFormElementSetValue($oSearch, $sSearch);вставляем слово для поиска
_IEFormSubmit($oForm, 0) ;отправляем запрос
_IELoadWait($oIE);ждем

For $i = 0 To 4 ;будем искать ссылки на 5-и первых страницах с результатами поиска.
	If $i Then ;на первой странице уже искали
		$sText = _IEBodyReadText($oIE) ;читаем текст на странице
		If StringInStr($sText, 'следующая') Then ;если на странице есть этот текст
			_IELinkClickByText($oIE, 'следующая') ;кликаем по ссылке, т.е. переходим на следующую страницу
		Else ;если на странице нет текста 'следующая'
			ExitLoop;выходим из цикла
		EndIf
	EndIf
	$oLinks = _IELinkGetCollection($oIE) ;получаем коллекцию ссылок на странице
	For $oLink In $oLinks ;в цикле проверяем все ссылки на странице
		If StringInStr($oLink.innertext, $sSearch) Then ;если в тексте ссылки есть искомое слово
			$j += 1;увеличиваем счетчик на 1
			ReDim $aLinks[$j + 1][2];изменяем размер массива
			$aLinks[$j][0] = $oLink.innertext;добавляем в массив текст ссылки
			$aLinks[$j][1] = $oLink.href;добавляем в массив адрес ссылки
		EndIf
	Next
	$aLinks[0][0] = $j;присваиваем этому элементу массива число - количество найденных ссылок.
Next
;_IEQuit($oIE) ;можно закрыть окно IE
_ArrayDisplay($aLinks, 'Найденные ссылки');показываем полученный массив
;теперь можно делать с найденными ссылками все, что Вам надо, например,
;сохранить найденные сведения в файл:
$hFile = FileOpen(@ScriptDir & '\Links.txt', 2)
FileWrite($hFile, 'По запросу "' & $sSearch & '" на yandex.ru найдено ' & $aLinks[0][0] & _
		' ссылок:' & @CRLF & @CRLF)
For $i = 1 To $aLinks[0][0]
	If $i <> $aLinks[0][0] Then
		FileWrite($hFile, $i & '. Текст ссылки: ' & $aLinks[$i][0] & @CRLF & _
				'Адрес ссылки: ' & $aLinks[$i][1] & @CRLF & @CRLF)
	Else
		FileWrite($hFile, $i & '. Текст ссылки: ' & $aLinks[$i][0] & @CRLF & _
				'Адрес ссылки: ' & $aLinks[$i][1])
	EndIf
Next
FileClose($hFile)
MsgBox(64, '', 'Готово :)')

Func _Exit()
	_IEQuit($oIE)
	Exit
EndFunc   ;==>_Exit
 
Автор
K

kseniya

Новичок
Сообщения
21
Репутация
1
madmasles,огромное спасибо!! :smile: буду разбираться!!правда хочется своими руками сделать... :smile:

а почеу в моем варианте окно с подсказкой появляется не сразу...??? а только если скрипт висит на выполнении втечение долгого времени...
Код:
;Работа со строкой поиска в яндексе и перебор ссылок
#include <IE.au3>
#include <Array.au3>
HotKeySet('{Esc}', '_Exit')
$j = 0; строка
Dim $aLinks[$j + 1][2]; j - строк и 2 - столбца

$sUrl = "http://yandex.ru"
$oText = "seleniumHQ" ; текст в строке поиска
$oIE =_IECreate($sUrl); открываем IE c нужным URL
$oForm= _IEFormGetCollection ($oIE, 0) ; получаем коолекцию всех элементов формы
$oLinks_0 = _IEFormElementGetObjByName($oForm, 0) ; найти 'элемент формы для строки поиска ;(найдена по номеру формы = 0 на странице )
_IEFormElementSetValue($oLinks_0, $oText) ; ввести в сторку поиска текст
_IEFormSubmit($oForm, 0); отправляем форму на сервер
_IELoadWait($oIE) ; ждём загрузки ; по умолчанию ждет загрузки страницы 5 мин.
$sSearch = "seleniumhq.org"

$oLinks = _IELinkGetCollection($oIE); получаем коллекцию ссылок

For $oLink In $oLinks
    If StringInStr($oLink.href, $sSearch) Then
        $j += 1
        ReDim $aLinks[$j + 1][2]; изменить размер массива
        $aLinks[$j][0] = $oLink.innertext
        $aLinks[$j][1] = $oLink.href
    EndIf
Next
$aLinks[0][0] = $j
_ArrayDisplay($aLinks); отобразим одномерный массив в окне сообщений

$j = 1
While 1
    ToolTip('№ ' & $j & ' - текст: ' & $aLinks[$j][0] & @CRLF & 'ссылка: ' & $aLinks[$j][1], 0, 0) 
	; отобразить окно подсказки на экране.
    _IENavigate($oIE, $aLinks[$j][1])
    $j += 1
    If $j = $aLinks[0][0] Then
        $j = 1
    EndIf
    ;тут можно делать со страницей то, что Вам надо
    Sleep(3000); приостановка скрипта 
WEnd

Func _Exit()
    _IEQuit($oIE)
    Exit
EndFunc   ;==>_Exit
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
kseniya [?]
почеу в моем варианте окно с подсказкой появляется не сразу.
ToolTip() должен появиться только после поиска ссылок и отображения массива. (кстати, $aLinks 2-мерный массив, а не одномерный, как у Вас в комментарии. Это существенная разница.)
Я не знаю Вашу скорость интернета, у меня на 4 Мбит/с довольно быстро отрабатывает. Проверил у сына на 20 Мбит/с почти мгновенно. :smile:
 
Верх