Что нового

Скрипт копирования инфы со страниц.

-BlackJack-

Новичок
Сообщения
13
Репутация
0
Ищу помощь у AutoIt'овцев.

Хочу сделать скрипт выдирания инфы с форумов, в частности - имен. Пример (лучшего не нашел) - hттp://vb.cybergame.su/members/list/. В данной форме имена находятся с переходом -

<font #768f9f="" color="">! &gt;&lt; Name &gt;&lt; !</font>

Есть так же вариант (желательно под него, так как таких вариантов можно найти больше)

<a href="member.php?u= 3131 ">name</а> - в этом случае номер(3131) перехода(ссылки) у каждого name меняется (пример u= 4221, u= 6443 и т.д.).

Нужны именно name. (не секрет для чего - для составления баз)

Работать должен в принципе под любым браузером(к примеру я пользуюсь
Код:
$sFF
)

В сохранении точно не определился, если с выбором в какой либо текстовик (save - 123.txt), то с интерфейсом, если же сразу(заранее создается и в него идет сохранение) создавать документ (сохранение.txt), то без.

За раннее огромное человеческо-аутойтное спасибо. Можно и сырой вариант, будет мотив доделать, появится больше опыта.(на ваше усмотрение).
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
-BlackJack-
Я думаю, универсальный скрипт, работающий со всеми браузерами, составить не получится...
Но можно скачать конкретную страницу в файл и выполнить разбор локально...
 
Автор
B

-BlackJack-

Новичок
Сообщения
13
Репутация
0
snoitaleR сказал(а):
-BlackJack-
Я думаю, универсальный скрипт, работающий со всеми браузерами, составить не получится...
Но можно скачать конкретную страницу в файл и выполнить разбор локально...
В принципе такой ответ я ждал.(ну попытка не пытка). Но это в общем то не проблема, просто один скрипт можно после адаптировать и под другие браузеры.

Ну на данный момент мне бы хотя бы вариант под Firefox.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
-BlackJack-
А чем плох локальный разбор?
 
Автор
B

-BlackJack-

Новичок
Сообщения
13
Репутация
0
snoitaleR сказал(а):
-BlackJack-
А чем плох локальный разбор?
1. У меня нет даже варианта под локальный.
2. Допусти страниц более 500, на скачивание такого объема уйдет много времени, проще сделать автоматизацию, с переходом от одной станицы к другой(к счастью url разбиваются в нумерном порядке по возрастанию).
3. Нашел тему timsky, проверил его скрипт http://autoit-script.ru/index.php?topic=1415.0, выдирает url выводя после инфу в таблице. Но что то придумать подобное или адаптировать да еще что бы из таблицы сохраняло у меня пока не получится - так как я пока что в танке.


Но буду рад любому варианту.
 

madmasles

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

Dim $aTest[1]
$sUrl = "http://vb.cybergame.su/members/list/"
$oIE = _IECreate($sUrl, 0, 0)
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
	If StringInStr($oLink.innertext, "!") <> 0 Then
		_ArrayAdd($aTest, "ник: " & $oLink.innertext & ", ссылка: " & $oLink.href)
	EndIf
Next
_IEQuit($oIE)
;_ArrayDisplay($aTest)
_FileWriteFromArray("Test.txt", $aTest, 1)
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
-BlackJack-
Вариант для локального перебора...

Код:
; НАЧАЛО

; Библиотеки

 #include <array.au3>
 #include <file.au3>

 $TURL="http://vb.cybergame.su/members/list/" ; шаблон
 $NURL=5 ; количество страниц

 ; Первая страница не индексируется

 SplashTextOn("Скачивание страницы","index.html",400,40,-1,int(@DesktopHeight*3/4),0,"courier",8) 
 $aTEXT=_GetText($TURL)
 _FileWriteFromArray("index1.txt",$aTEXT,1)
 ; _ArrayDisplay($aTEXT)

 ; Цикл скачивания

 For $iURL=2 To $NURL

  SplashTextOn("Скачивание страницы","index"&$iURL&".html",400,40,-1,int(@DesktopHeight*3/4),0,"courier",8)
  $aTEXT=_GetText($TURL&"index"&$iURL&".html")
  _FileWriteFromArray("index"&$iURL&".txt",$aTEXT,1)
  ;_ArrayDisplay($aTEXT)

 Next

 SplashOff()

 MsgBox(0,"","Скачивание завершено")

 Func _GetText($URL)

  $LIST=""

  Local $hDownload=InetGet($URL,'url.tmp',1,1)
  Do
   Sleep(100)
  Until InetGetInfo($hDownload,2)
  InetClose($hDownload)

  $TEXT=FileRead('url.tmp')

  $TEXT=StringReplace($TEXT,Chr(10),"")
  $TEXT=StringReplace($TEXT,Chr(13),"")

  Do

   $POS=StringInStr($TEXT,"<font color #768F9F>")
   $TEXT=StringTrimLeft($TEXT,$POS+19)
   $POS=StringInStr($TEXT,"</font>")
   $S=StringMid($TEXT,1,$POS-1)
   $LIST=$LIST&"|"&$S
   $TEXT=StringTrimLeft($TEXT,$POS+7)

  Until $POS=0

  Return StringSplit($LIST,"|")
 
 EndFunc

; КОНЕЦ
 
Автор
B

-BlackJack-

Новичок
Сообщения
13
Репутация
0
madmasles сказал(а):
-BlackJack-
Попробуйте так:
Код:
#include <IE.au3>
#include <Array.au3>
#include <File.au3>

Dim $aTest[1]
$sUrl = "http://vb.cybergame.su/members/list/"
$oIE = _IECreate($sUrl, 0, 0)
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
	If StringInStr($oLink.innertext, "!") <> 0 Then
		_ArrayAdd($aTest, "ник: " & $oLink.innertext & ", ссылка: " & $oLink.href)
	EndIf
Next
_IEQuit($oIE)
;_ArrayDisplay($aTest)
_FileWriteFromArray("Test.txt", $aTest, 1)

Попробовал, система работает. Только удалил вот эту часть-
Код:
& ", ссылка: " & $oLink.href)


После в текстовик сохраняются только имена. Но, дело в том, что сохраняются они только по установленному Вами знаку "!", и записываются только это вида, допустим на странице присутствуют начальные имена с знаками "-" или же просто начинаются букв,
Пример:
!!!Кнопка!!! - сохранил(начальный символ "!")
!!!!!123!!!! - сохранил(начальный символ "!")
-=1=- - пропускает
Скрипт- пропускает
Тема- пропускает
Аутойт- пропускает

то скрипт их пропускает. Другие сохранятся в том случае, если его сменить - это первое. Второе - если я сменил знак и продолжил записывать в этот же текстовик, то он попросту стирает все что было и записывает по новой.



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

snoitaleR сказал(а):
-BlackJack-
Вариант для локального перебора...

Код:
; НАЧАЛО

; Библиотеки

 #include <array.au3>
 #include <file.au3>

 $TURL="http://vb.cybergame.su/members/list/" ; шаблон
 $NURL=5 ; количество страниц

 ; Первая страница не индексируется

 SplashTextOn("Скачивание страницы","index.html",400,40,-1,int(@DesktopHeight*3/4),0,"courier",8) 
 $aTEXT=_GetText($TURL)
 _FileWriteFromArray("index1.txt",$aTEXT,1)
 ; _ArrayDisplay($aTEXT)

 ; Цикл скачивания

 For $iURL=2 To $NURL

  SplashTextOn("Скачивание страницы","index"&$iURL&".html",400,40,-1,int(@DesktopHeight*3/4),0,"courier",8)
  $aTEXT=_GetText($TURL&"index"&$iURL&".html")
  _FileWriteFromArray("index"&$iURL&".txt",$aTEXT,1)
  ;_ArrayDisplay($aTEXT)

 Next

 SplashOff()

 MsgBox(0,"","Скачивание завершено")

 Func _GetText($URL)

  $LIST=""

  Local $hDownload=InetGet($URL,'url.tmp',1,1)
  Do
   Sleep(100)
  Until InetGetInfo($hDownload,2)
  InetClose($hDownload)

  $TEXT=FileRead('url.tmp')

  $TEXT=StringReplace($TEXT,Chr(10),"")
  $TEXT=StringReplace($TEXT,Chr(13),"")

  Do

   $POS=StringInStr($TEXT,"<font color #768F9F>")
   $TEXT=StringTrimLeft($TEXT,$POS+19)
   $POS=StringInStr($TEXT,"</font>")
   $S=StringMid($TEXT,1,$POS-1)
   $LIST=$LIST&"|"&$S
   $TEXT=StringTrimLeft($TEXT,$POS+7)

  Until $POS=0

  Return StringSplit($LIST,"|")
 
 EndFunc

; КОНЕЦ
Классный скрипт. Но он работает на простом переходе index.html, а если переход типа memberlist.php?&order=asc&sort=username&page=номер страницы, + он зачем то сохраняет часть кода и некоторые ссылки внизу(но это в общем то не проблема).

----------------
Все со страницами разобрался. Осталось только то, что не могу подставить правильно <a href="member.php?u= 3131 ">name</а>, так как - номер у этой части все время меняется для каждого ника - member.php?u= 3131, новый адрес (member.php?u= 5555; 6666; 7777 и т.д.). А если оставлять только <a href="member.php?u= "> и </а> без цифр, то выдает ошибку.
В этом случае, он тупо копирует от начального <a> до конечного </a>.
Код:
$POS=StringInStr($TEXT,"<a>")
   $TEXT=StringTrimLeft($TEXT,$POS+19)
   $POS=StringInStr($TEXT,"</a>")
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
-BlackJack-
Данный скрипт, конечно, не универсальный...
Он был составлен под конкретную ситуацию...
Но самое сложное - это записать спецсимволы, которыми усыпаны ники, в текстовый файл... :smile:


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

-BlackJack-

Попробуй перед вырезанием имени удалить с помощью StringRegExpReplace() любые цифры после u= в коде:
Код:
<a href="member.php?u= 3131 ">


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

-BlackJack-
А можно попросить URL страницы с <a href="member.php?u= 3131 ">?
 
Автор
B

-BlackJack-

Новичок
Сообщения
13
Репутация
0
Отправил пример в лс.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
-BlackJack-
Заменил содержание цикла:

Код:
Do

   $POS=StringInStr($TEXT,'<a href="member.php')
   $TEXT=StringTrimLeft($TEXT,$POS-1)
   $POS=StringInStr($TEXT,'>')
   $TEXT=StringTrimLeft($TEXT,$POS)
   $POS=StringInStr($TEXT,"</a>")
   $S=StringMid($TEXT,1,$POS-1)
   MsgBox(0,"",$S)
   $LIST=$LIST&"|"&$S
   $TEXT=StringTrimLeft($TEXT,$POS+4)

  Until $POS=0
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
-BlackJack-
Такой вариант вам подойдёт?
Код:
;~ http://vb.cybergame.su/members/list/
#include <IE.au3>
$sPath = "http://vb.cybergame.su/members/list/"
$oIE = _IECreate($sPath)
$oTDs = _IETagNameGetCollection ($oIE,"td")
$hFile = FileOpen ( @ScriptDir & "\db.txt", 1 )
If $hFile = -1 Then
    MsgBox(0, "Error", "Невозможно открыть файл!")
    Exit
EndIf
FileWriteLine($hFile, "[ " & @MDAY & "." & @MON & "." & @YEAR & " - " & @HOUR & ":" & @MIN & ":" & @SEC&" ]")
For $oTD In $oTDs
	If $oTD.className = 'alt1Active' And $oTD.className <> "" Then
		$oLinks = _IETagNameGetCollection($oTD, "a")
		For $oLink In $oLinks
			If Not FileWriteLine($hFile, $oLink.innerText & " | " & $oLink.href ) Then 
			    MsgBox(0, "Error", "Невозможно записать данные в файл!")
				Exit
			EndIf
		Next
	EndIf
Next
MsgBox(0, "Ok!", "Данные успешно занесены в базу!")
FileClose($hFile)
 
Автор
B

-BlackJack-

Новичок
Сообщения
13
Репутация
0
Garrett, спс за вариант, по простоте и функциональности как у madmasles(даже скорее всего его, но переделанный), но лучше тем, что сохраняет все подряд имена. Лишним было время и и ссылки, убрал, теперь сохраняет чисто список. Жаль не пашет почему то на мозилле, хотя скрипт madmasles я запустил спокойно.


Но все равно всем огромное спасибо за вашу помощь.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
-BlackJack- [?]
как у madmasles(даже скорее всего его, но переделанный)
Да, я просто его немного поправил и добавил время архивации данных. (думаю, madmasles на меня не держит в обиды :smile:)
-BlackJack- [?]
Жаль не пашет почему то на мозилле.
Он на FireFox не будет работать, так как используется IE.au3 а она только под IE. Хотя я и поклонник FireFox , но UDF которая написана для мазилы, мне не нравится :(
Остаётся ждать доброго человека, который напишет удобную UDF под FireFox. :smile:
 
Автор
B

-BlackJack-

Новичок
Сообщения
13
Репутация
0
snoitaleR, скрипт работает, убрал в вашем дополнение
Код:
MsgBox(0,"",$S)

И все стало ок. Но все же не могу понять, почему он копирует практически весь код после имен. Вроде начинается все правильно, вырезает нужные строки(имена), а после тупо пол страницы. В выше перечисленных вариантах скриптов, имена копируются вполне нормально и сохраняются в текстовик без лишнего кода.
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
А почему не такой вариант ?
Код:
#include <IE.au3>
#include <Array.au3>
$sUrl = "http://vb.cybergame.su/members/list/"
$oIE = _IECreate($sUrl,1)
$sHTML = _IEBodyReadHTML ($oIE)
$sPattern="(?si)<a.+?(?:<font.+?|member.php.+?)>([^<]+?)<"
$aName=StringRegExp ( $sHTML, $sPattern,3)
_ArrayDisplay($aName)

Получить текст страницы наверное можно и другим более универcальным способом.
Если местонахождение имен на других сайтах отличается достаточно добавить ориентир в скобку (?: ...|...)
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
-BlackJack-
Изменил содержание цикла...
Действительно, была логическая ошибка...
В начале цикла $POS - это позиция текста '<a href="member.php'...
А в конце, перед проверкой, это уже позиция текста '</ a>'...
Поэтому я сделал цикл бесконечным (Until False) и добавил проверку $POS=0 в начало цикла...

Код:
Do

   $POS=StringInStr($TEXT,'<a href="member.php')
   If $POS=0 Then ExitLoop
   $TEXT=StringTrimLeft($TEXT,$POS-1)
   $POS=StringInStr($TEXT,'>')
   $TEXT=StringTrimLeft($TEXT,$POS)
   $POS=StringInStr($TEXT,"</a>")
   $S=StringMid($TEXT,1,$POS-1)
   $LIST=$LIST&"|"&$S
   $TEXT=StringTrimLeft($TEXT,$POS+4)

  Until False



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

gregaz
Попробовал заменить свой цикл на StringRegExp...
Первое вхождение почему-то теряется...
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
snoitaleR [?]
Попробовал заменить свой цикл на StringRegExp...
Первое вхождение почему-то теряется...
Попробовал в твоем скрипте так :
Код:
.................
$TEXT=FileRead('url.tmp')
;$TEXT=StringReplace($TEXT,Chr(10),"")
 ;$TEXT=StringReplace($TEXT,Chr(13),"")
MsgBox(0,'$TEXT',$TEXT)
$sPattern="(?si)<a.+?(?:<font.+?|member.php.+?)>([^<]+?)<"
$aName=StringRegExp ( $TEXT, $sPattern,3)
_ArrayDisplay($aName)

Получил тот же массив что и у меня.





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

Если через цикл , то имеем дополнительно :

одну пустую строку вначале и одну строку лишнюю(последнюю)

Это все про 1-й сайт - 2-го у меня нет
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
gregaz
Рассмотрим страницу: http://vb.cybergame.su/members/list/
Первый пользователь: ! >< MoZG >< !...
Через StringRegExp получаю первого пользователя: ! Ignatiev, который идет вторым по списку...

На всякий случай мой код:

Код:
; НАЧАЛО

; Библиотеки

 #include <array.au3>
 #include <file.au3>

 $TURL="http://vb.cybergame.su/members/list/" ; шаблон

 $aTEXT=_GetText($TURL)
 _FileWriteFromArray("index1.txt",$aTEXT,1)

 MsgBox(0,"","Скачивание завершено")

 Func _GetText($URL)

  $LIST=""

  Local $hDownload=InetGet($URL,'url.tmp',1,1)
  Do
   Sleep(100)
  Until InetGetInfo($hDownload,2)
  InetClose($hDownload)

  $TEXT=FileRead('url.tmp')

  $sPattern="(?si)<a.+?(?:<font.+?|member.php.+?)>([^<]+?)<"

  Return StringRegExp($TEXT,$sPattern,3)
 
 EndFunc

; КОНЕЦ
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Вот пробую на твоем последнем варианте так :
Код:
; НАЧАЛО

; Библиотеки

 #include <array.au3>
 #include <file.au3>

 $TURL="http://vb.cybergame.su/members/list/" ; шаблон

 $aTEXT=_GetText($TURL)
 ;_FileWriteFromArray("index1.txt",$aTEXT,1)
_ArrayDisplay($aTEXT)
 ;MsgBox(0,"","Скачивание завершено")

 Func _GetText($URL)

  $LIST=""

  Local $hDownload=InetGet($URL,'url.tmp',1,1)
  Do
   Sleep(100)
  Until InetGetInfo($hDownload,2)
  InetClose($hDownload)

  $TEXT=FileRead('url.tmp')

  $sPattern="(?si)<a.+?(?:<font.+?|member.php.+?)>([^<]+?)<"

  Return StringRegExp($TEXT,$sPattern,3)
 
 EndFunc

; КОНЕЦ

Получаю :
Первый пользователь : ! &gt;&lt; MoZG &gt;&lt; ! (пользователь использовал некорректные символы в логине (< и >)
Может быть теряется при попытке записать в файл ?
 
Верх