Что нового

Кравлер логинов

Greens

Новичок
Сообщения
20
Репутация
0
Здравствуйте.Требуется сделать скрипт который забирал бы логины пользователей со страницы и переписывал их в txt файл.
Всё бы хорошо и можно сделать попиксильно, но проблема в том, что страниц с логинами много и на разных страницах они расположены неодинаково.Логины являются гиперссылками соответственно курсор сразу меняет свой вид на указательный палец.Можно ли сделать проверку, при которой если курсор меняется на указательный палец скрипт копирует текст и переносит его в txt файл?Заранее спасибо.
 

madmasles

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

Dim $aLink[1]
$i = 0
$oIE = _IECreate("http://www.google.ru/", 0, 0)
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
	$aResult = StringRegExp($oLink.innertext, "[a-z,A-Z,0-9]", 3)
	If StringLen($oLink.innertext) >= 6 And UBound($aResult) = StringLen($oLink.innertext) Then
		_ArrayAdd($aLink, $oLink.innertext)
		$aLink[0] += 1
	EndIf
Next
_IEQuit($oIE)
If $aLink[0] > 0 Then
	_ArrayDisplay($aLink)
Else
	MsgBox(0, "", "Нет логинов.")
EndIf
 
Автор
G

Greens

Новичок
Сообщения
20
Репутация
0
Хм,хороший способ,остаётся только дописать в скрипт фильтрацию ссылок чтоб ловил только с латинским алфавитом и не меньше 6 знаков(а то кроме логинов там ещё ссылки присутствуют) и переход между страницами (page=1 и page=2), подскажите как сделать =)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Greens
Если page=1 и page=2 ссылки, то попробуйте так
Код:
;...
_IELinkClickByText($oIE, "page=2")
;...
 
Автор
G

Greens

Новичок
Сообщения
20
Репутация
0
page=1 и page=2 это отличие в полном доменном имени между первой и второй страницей,ну впринципе я понял как организовать переход на следующюю страницу,остаётся только вопрос фильтрации всего кроме латинского алфавита
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Greens
Я в первом своем ответе код поправил. Попробуйте так.

PS
Если цифр в логинах нет, то
Код:
$aResult = StringRegExp($oLink.innertext, "[a-z,A-Z,0-9]", 3)
Замените на
Код:
$aResult = StringRegExp($oLink.innertext, "[a-z,A-Z]", 3)
 
Автор
G

Greens

Новичок
Сообщения
20
Репутация
0
Всё работает хорошо,но берёт логины только с одной страницы,как я понял за переход между страницами должна отвечать строчка
Код:
$aLink[0] += 1
(если я не прав скажите какая строчка)
Должно быть чтобы он сначала брал логины с примерно такой страницы http://forum.example.ru/memberlist.php?&order=asc&sort=username&page=1 потом со страницы http://forum.example.ru/memberlist.php?&order=asc&sort=username&page=2 и так далее,как бы это простейшая арифметическая прогрессия, но как её вписать в код не знаю,наверное надо ставить страницу как переменную и после каждого цикла увеличивать её на 1 :-\
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Greens
Строчка $aLink[0] += 1 отвечает за подсчет кол-ва логинов в массиве.
Предыдущий код был без перехода на другую страницу.
С переходом попробуйте так:
Код:
#include <IE.au3>
#include <Array.au3>

Dim $aLink[1]
$sUrl = "http://forum.example.ru/memberlist.php?&order=asc&sort=username&page="

$oIE = _IECreate("about:blank", 0, 0)

For $i = 1 To 3 ;эта цифра отвечает за кол-во страниц перехода
	_IENavigate($oIE, $sUrl & $i)
	$oLinks = _IELinkGetCollection($oIE)
	For $oLink In $oLinks
		$aResult = StringRegExp($oLink.innertext, "[a-z,A-Z,0-9]", 3)
		If StringLen($oLink.innertext) >= 6 And UBound($aResult) = StringLen($oLink.innertext) Then
			_ArrayAdd($aLink, $oLink.innertext)
			$aLink[0] += 1
		EndIf
	Next
Next
_IEQuit($oIE)
If $aLink[0] > 0 Then
	$aLink = _ArrayUnique($aLink, 1, 1) ;удаляет совпадающие логины.
	_ArrayDisplay($aLink)
Else
	MsgBox(0, "", "Нет логинов.")
EndIf
 
Автор
G

Greens

Новичок
Сообщения
20
Репутация
0
Спасибо,всё работает,ну и последнее- как всё это вывести не в array окно а записать в ini или txt файл?Я попробывал вместо строчки
Код:
_ArrayDisplay($aLink)
прописать
Код:
IniWrite ( "файл", "", "", $aLink )
но почему то логины он туда не выводит
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Greens
Так можно записать массив в файл:
Код:
#include <File.au3>
;...
;_ArrayDisplay($aLink)
_FileWriteFromArray("файл.txt", $aLink, 1)
;...
А так записать в ini-файл
Код:
;...
;_ArrayDisplay($aLink)
For $ii = 1 To UBound($aLink) - 1
	IniWrite("файл.ini", "Logins", $ii & "_login", $aLink[$ii])
Next
;...
 
Автор
G

Greens

Новичок
Сообщения
20
Репутация
0
madmasles , огромное вам спасибо, всё работает на ура, получилось даже лучше чем я хотел :beer: :IL_AutoIt_1:
 
Верх