Показать полную графическую версию : [решено] Выгрузка прокси с сайта
Всем привет! Помогите чем могите=) Вроде бы все довольно просто, но никак не получается собраться с мыслями, то они заняты - то я... Да и с опытом беда.
Нужен скрипт автоматически выбирающий прокси с определенного сайта, допустим http://nntime.com - этот мне нравится, раздел подходит любой, загонять необходимое количество в тхт файл.
После нужна сортировка такого вида: прокси с одинаковым третьим октетом удаляются, т.е. если в списке есть 221.130.75.200, то 221.130.75.48 уже удаляется, а 221.130.76.17 остаётся.
У меня основная сложность с тем как в коде странички выделить именно отрезок с айпишником, ну и маской поиска ведь в любом из октетов может состоять из разного количества цифр 192.168.160.95 и 72.89.1.1, да и порт тоже бывает разный.
Строка с IP имеет код
<tr class="odd"><td><input type="checkbox" name="c3" id="row3" value="20612057442.53.171.1402666209980" onclick="choice()" /></td><td>202.53.171.140<script type="text/javascript">document.write(":"+m+y)</script></td>
При этом порт это 2 или 4 последних цифры value, а перед IP адресом всегда есть код onclick="choice()" /></td><td> и <script type="text/javascript">document.write - после
Пока есть только маленькая часть
Dim $prot = "http://"
Dim $domen = "nntime.com"
Dim $delim = "/"
Dim $s_get = "proxy-list-01.htm"
Dim $s_page = "proxy-list-01.htm"
$oIE = _IECreateEmbedded ( )
$oIE = _IECreate ($domen&$delim&$s_page)
$Html = _IEDocReadHTML($oIE)
$get_data = _IEBodyReadHTML($oIE)
ну а дальше рисуем какую нибудь маску поиска =)
И то, помнится вроде как-то можно подключаться к страничке без её загрузки... так было бы удобнее, но пока не нашел как, с английским не совсем ферштейн. А если еще на ходу проверять IP на работоспособность, то вообще красота будет.
madmasles
13-12-2010, 18:36
zbruy,
Примерно так у меня получилось
Часть 1:#include <Array.au3>
#include <INet.au3>
Opt('MustDeclareVars', 1)
Dim $aIP[1]
Dim $aWrite[1][2]
Global _
$sStart = 'Поиск начат: ' & @MDAY & '.' & @MON & '.' & @YEAR & ' ' & @HOUR & ':' & _
@MIN & ':' & @SEC, _
$sFile = @ScriptDir & '\' & @MDAY & '_' & @MON & '_' & @HOUR & '_' & _
@MIN & 'proxy.txt', _
$iN, $aTemp, $aResult, $hFile, $sEnd, $sRes, $iErr, $sTimer, $n = 0
$iN = _GetNumberPagesAll()
If @error Then
MsgBox(16, '', 'Error')
Exit
EndIf
For $i = 1 To $iN
$aTemp = _GetProxyAll($i)
If Not @error Then
ToolTip('Обработана ' & $i & ' страница из ' & $iN, 0, 0)
_ArrayConcatenate($aIP, $aTemp)
$aIP[0] = UBound($aIP) - 1
Else
MsgBox(16, $i, 'Error')
EndIf
Next
If Not $aIP[0] Then
MsgBox(16, '', 'Error')
Exit
EndIf
ToolTip('Идет обработка прокси', 0, 0)
$aResult = _ProxyUnique($aIP, '(\d{1,3}\.\d{1,3}\.\d{1,3}\.)\d.*')
If @error Then
MsgBox(16, $i, 'Error')
Exit
EndIf
_ArrayDisplay($aResult)
TCPStartup()
For $i = 1 To $aResult[0][0]
ToolTip('Идет проверка ' & $aResult[$i][0] & @CRLF & $i & ' из ' & $aResult[0][0], 0, 0)
$sRes = _ProxyCheck($aResult[$i][0], 10)
$iErr = @error
$sTimer = @extended
If Not $iErr Then
If StringInStr($sRes, '200 OK') Then
$sTimer = StringFormat('%.2f', $sTimer / 1000) & ' сек.'
$aResult[$i][1] = @TAB & @TAB & @TAB & $sTimer
Else
$aResult[$i][1] = 'Bad'
EndIf
Else
$aResult[$i][1] = 'Bad'
EndIf
Next
TCPShutdown()
For $i = 1 To $aResult[0][0]
If $aResult[$i][1] And $aResult[$i][1] <> 'Bad' Then
$n += 1
ReDim $aWrite[$n + 1][2]
$aWrite[0][0] = $n
$aWrite[$n][0] = $aResult[$i][0]
$aWrite[$n][1] = $aResult[$i][1]
EndIf
Next
$hFile = FileOpen($sFile, 2)
FileWrite($hFile, $sStart & @CRLF & 'Найдено ' & $aWrite[0][0] & ' прокси.' & @CRLF & @CRLF)
For $i = 1 To $aWrite[0][0]
FileWrite($hFile, $aWrite[$i][0] & $aWrite[$i][1] & @CRLF)
Next
$sEnd = 'Поиск закончен: ' & @MDAY & '.' & @MON & '.' & @YEAR & ' ' & @HOUR & ':' & _
@MIN & ':' & @SEC
FileWrite($hFile, $sEnd)
FileClose($hFile)
ToolTip('')
MsgBox(64, 'Все готово', 'Найдено ' & $aWrite[0][0] & ' прокси. Прокси сохранены в файл ' & _
@CRLF & $sFile)
Func _ProxyUnique($aArray, $sPattern)
Dim $aReturn[1][2]
Local $j = 0, $sIP, $iIndex
If Not IsArray($aArray) Then Return SetError(1)
For $i = 1 To $aArray[0]
$sIP = StringRegExpReplace($aArray[$i], $sPattern, '\1')
If Not @extended Then Return SetError(1)
$iIndex = _ArraySearch($aArray, $sIP, $i + 1, 0, 0, 1)
If $iIndex = -1 Then
$j += 1
ReDim $aReturn[$j + 1][2]
$aReturn[0][0] = $j
$aReturn[$j][0] = $aArray[$i]
EndIf
Sleep(1)
Next
If Not $aReturn[0][0] Then Return SetError(1)
Return SetError(0, 0, $aReturn)
EndFunc ;==>_ProxyUnique
Функция проверки proxy на живучесть (http://autoit-script.ru/index.php?topic=636.0)
madmasles
13-12-2010, 18:39
Часть 2:
Func _GetProxyAll($iNum)
$iNum = StringFormat('%02d', $iNum)
Local $sURL = 'http://nntime.com/proxy-list-' & $iNum & '.htm'
Local $sSource, $aProxy, $aTempPort
Dim $aPort[10][2]
$sSource = _INetGetSource($sURL)
If Not $sSource Then Return SetError(1)
$aTempPort = StringRegExp($sSource, '([a-z]=\d)', 3)
If UBound($aTempPort) <> 10 Then Return SetError(1)
For $i = 0 To 9
$aPort[$i][0] = '+' & StringLeft($aTempPort[$i], 1)
$aPort[$i][1] = StringRight($aTempPort[$i], 1)
Next
$aProxy = StringRegExp($sSource, '\>(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.*?)\Q)</script>\E', 3)
If @error Then Return SetError(1)
For $i = 0 To UBound($aProxy) - 1
$aProxy[$i] = StringRegExpReplace($aProxy[$i], _
'^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?\:\"(.*?)$', '\1:\2')
If Not @extended Then Return SetError(1)
For $w = 0 To 9
$aProxy[$i] = StringReplace($aProxy[$i], $aPort[$w][0], $aPort[$w][1])
Next
If Not StringRegExp($aProxy[$i], '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{2,5})', 0) _
Then Return SetError(1)
Next
Return SetError(0, 0, $aProxy)
EndFunc ;==>_GetProxyAll
Func _GetNumberPagesAll()
If Not Ping('nntime.com') Then Return SetError(1)
Local $sURL = 'http://nntime.com/'
Local $sSource, $iNumber
$sSource = _INetGetSource($sURL)
If Not $sSource Then Return SetError(1)
$iNumber = StringRegExpReplace($sSource, _
'(?s).*?\Qhtm">\E(\d+)\Q</a> <a href="proxy-list-02.htm">\E.*', '\1')
If @extended Then
$iNumber = Number($iNumber)
Return SetError(0, 0, $iNumber)
Else
Return SetError(1)
EndIf
EndFunc ;==>_GetNumberPagesAll
Func _ProxyCheck($sProxyPort, $iTimeout = 30)
Local $sIP, $iPort, $socket, $command, $timeout, $resp
If Not Ping('zerg.helllabs.net') Then Return SetError(1)
If Not StringRegExp($sProxyPort, '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{2,5})', 0) _
Then Return SetError(1)
$sIP = StringRegExpReplace($sProxyPort, '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\:?.*', '\1')
$iPort = Number(StringRegExpReplace($sProxyPort, '.*?\:(\d{2,4})', '\1'))
$socket = TCPConnect($sIP, $iPort)
If $socket = -1 Then
Return SetError(1)
Else
$command = "GET http://zerg.helllabs.net/cgi-bin/textenv.pl HTTP/1.1" & @CRLF
$command &= "Host: zerg.helllabs.net" & @CRLF
$command &= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" & @CRLF
$command &= "Connection: close" & @CRLF
$command &= "" & @CRLF
TCPSend($socket, $command)
$timeout = TimerInit()
While 1
$resp = TCPRecv($socket, 5000)
If $resp <> "" Then
$timeout = TimerDiff($timeout)
ExitLoop
EndIf
If TimerDiff($timeout) > $iTimeout * 1000 Then
Return SetError(2)
EndIf
Sleep(1)
WEnd
EndIf
Return SetError(0, $timeout, $resp)
EndFunc ;==>_ProxyCheck
Пришлось разбить скрипт на 2 части, иначе ругается, что символов слишком много.
madmasles, просто шикарный скрипт! Мне такой не написать, я и половины использованных операторов не знаю=) Теперь неделю сидеть вникать, что и как тут работает, чтобы адаптировать под свои нужды. А то проверка 2к прокси со ста страниц занимает пол дня=)
Спасибо. Вещь получилась архи полезная.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.