Что нового

[Сеть, интернет] Парсинг сайта

TiranCool

Новичок
Сообщения
78
Репутация
0
Народ помогите с парсингом по сайту,нужно :
автоматический ввод никнеймов из TXT файла в поле поиска игрока,затем взять название танков 10лвл,средний урон за какой то промежуток времени(неделя,мес к примеру) и записать данные в таблицу exel




Код:
#include <IE.au3>
$hFile = FileOpen("C:\1.txt", 1)
If $hFile = -1 Then
    MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
    Exit
EndIf


Local $oIE = _IECreate("http://wotomatic.net/?search=19_APEC_75#",0,1,0,1)
Sleep(2000)
Local $oDiv = _IEGetObjById($oIE, "tbody")
Local $oLis = _IETagNameGetCollection($oDiv, "tr")
For $oLi In $oLis
 If StringInStr ($oLi.innerhtml,"addons detail")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")

  Local $aArray = StringRegExp($oLiHtml,"width",' \ ((.*?) \ )',1)
  Global $Num=$aArray[0]
 EndIf
next

FileWrite($hFile, "$Num")

MsgBox(64,"",$Num);
_IEQuit($oIE)
FileClose($hFile)
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Направьте меня,все уже посмотрел,не получается взять данные с сайта,помогите хотя бы с тем как забрать данные с определенной строки
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Вытащить список моделей:
Код:
#include <IE.au3>
$oIE = _IECreate("http://wotomatic.net/?search=19_APEC_75#",0,1,1,1)
$str = _IEDocReadHTML($oIE)
$models = StringRegExp($str, 'cW">(.*)</span></p>', 3)
If IsArray($models) Then
	For $model in $models
		ConsoleWrite($model & @CRLF)
	Next
EndIf
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
cW">(.*)</span></p>
Что данное выражение означает,расскажите поподробнее пожалуйста,особенно не понятно cW">(.*)
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Берем исходный код страницы, видим, что модели все танков записаны в виде .....cW">Модель танка</span></p>.....
Значит нам надо вытащить то, что находится между .....cW"> и </span></p>.....
Дальше топаем в раздел справки по регулярным выражениям (честно сам на память не помню и каждый раз подглядываю в шпаргалку) и строим регулярное выражение, которое из строки
.....cW">ИС-7</span></p>.... вернет нам ИС-7, из .....cW">Т-34</span></p>.... вернет Т-34 и т.д.
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Спасибо,но не все понял,я пытался вытащить цифры из кода,но не получется,не правильно выбрал регулятор?
Код:
#include <IE.au3>
$oIE = _IECreate("http://wotomatic.net/?search=19_APEC_75#",0,1,1,1)
$str = _IEDocReadHTML($oIE)
$models = StringRegExp($str, 'cW">(.*)</span class="c6"></d>', 3)
If IsArray($models) Then
    For $model in $models
        ConsoleWrite($model & @CRLF)
    Next
EndIf



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

cW" не понял этого,откуда взялось и что означает,прочел уже все
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Еще раз по шагам:
1) Заходим браузером на страницу
2) Сохраняем страницу себе на комп
3) Открываем сохраненную страницу блокнотом
4) Находим в блокноте ИС-7
5) Видим, что ИС-7 находится в строке ><p><span class="cW">ИС-7</span></p><table
6) Пишем регулярное выражение, которое вернет то, что находится между ><p><span class="cW"> и </span></p><table, но чтобы так много не писать по краям, отбрасываем лишнее, оставляя cW"> и </span></p>

P.S.
IE кстати не нужен:
Код:
$logins = FileReadToArray(@ScriptDir & "\logins.txt") ;берем логины из файла
For $login In $logins
	$str = InetRead("http://wotomatic.net/?search=" & $login, 1) ;запрашиваем страницу для каждого логина
	$str = BinaryToString($str, 16)
	$tanks10lvl = StringRegExp($str, '<tr class="vehicle vLevel0(.*) </td></tr>', 3) ;парсим список танков 10 лвл
	For $tank In $tanks10lvl
		$name = StringRegExp($tank, '<p><span class="cW">(.*)</span></p><table', 3) ;для каждого танка из списка парсим имя, кол-во боев, урон и процент побед
		$boi = StringRegExp($tank, 'Всего боёв</td><td>(.*)</td></tr><tr><td>Одержано', 3)
		$uron = StringRegExp($tank, 'Средний урон</td><td><span class="c.">(.*)</span></td></tr><tr><td>Средний опыт', 3)
		$pobedy = StringRegExp($tank, '%"><span class="c.">(.*%)</span></td><td class="progressEmpty', 3)
		FileWriteLine(@ScriptDir & "\str2.txt", $login & ";" & $name[0] & ";" & $boi[0] & ";" & $uron[0] & ";" & $pobedy[0]) ;пишем в файл через точку с запятой
	Next
Next
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Все круто,но у меня ошибку выдает
C:\Users\Timur\Desktop\AutoIt v3 Script.au3" (6) : ==> Variable must be of type "Object".:
For $tank In $tanks10lvl
For $tank In $tanks10lvl^ ERROR
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Ну как бы не в скрипте дело :whistle:
 

Вложения

  • .JPG
    .JPG
    18.1 КБ · Просмотры: 14
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
У меня сайт работает,я на него спокойно захожу.а при запуске скрипта выдает ошибку через какое то время,так же пробовал от имени администратора запускать
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Что в консоли пишет?
Логины в файле в столбик, каждый с новой строки?

Код:
$logins = FileReadToArray(@ScriptDir & "\logins.txt") ;берем логины из файла
if IsArray($logins) Then
	For $login In $logins
		$url = "http://wotomatic.net/?search=" & $login
		ConsoleWrite("Проверяем " & $url & @CRLF)
		$str = InetRead($url, 1) ;запрашиваем страницу для каждого логина
		$str = BinaryToString($str, 16)
		ConsoleWrite("Получено " & StringLen($str) & @CRLF)
		$tanks10lvl = StringRegExp($str, '<tr class="vehicle vLevel0(.*) </td></tr>', 3) ;парсим список танков 10 лвл
		If IsArray($tanks10lvl) Then
			For $tank In $tanks10lvl
				$name = StringRegExp($tank, '<p><span class="cW">(.*)</span></p><table', 3) ;для каждого танка из списка парсим имя, кол-во боев, урон и процент побед
				$boi = StringRegExp($tank, 'Всего боёв</td><td>(.*)</td></tr><tr><td>Одержано', 3)
				$uron = StringRegExp($tank, 'Средний урон</td><td><span class="c.">(.*)</span></td></tr><tr><td>Средний опыт', 3)
				$pobedy = StringRegExp($tank, '%"><span class="c.">(.*%)</span></td><td class="progressEmpty', 3)
				FileWriteLine(@ScriptDir & "\str2.txt", $login & ";" & $name[0] & ";" & $boi[0] & ";" & $uron[0] & ";" & $pobedy[0]) ;пишем в файл через точку с запятой
			Next
		Else
			ConsoleWrite("Список танков не получен" & @CRLF)
			Exit
		EndIf

	Next
Else
	ConsoleWrite("Список логинов не получен" & @CRLF)
	Exit
EndIf
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
По новому скрипту
в консоли пишет: сайт еще глючить стал
Проверяем http://wotomatic.net/?search=Dep3kul
Получено 132750
Проверяем http://wotomatic.net/?search=_APEC_75
Получено 0
Список танков не получен
+>23:59:48 AutoIt3.exe ended.rc:0
+>23:59:48 AutoIt3Wrapper Finished.
>Exit code: 0 Time: 34.62
 

hedji

Продвинутый
Сообщения
409
Репутация
94
По http://wotomatic.net/?search=Dep3kul Получено 132750 в str2.txt что-нибудь выдал?
По второму на сайте: ОШИБКА: Не найден игрок с именем "_APEC_75"
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Dep3kul;Bat.-Chatillon 25 t;897;3170;68,34%
Dep3kul;AMX 50 B;727;3602;72,63%
Dep3kul;Объект 140;632;3203;71,36%
Dep3kul;TVP T 50/51;589;3355;67,23%
Dep3kul;VK 72.01 (K);272;2923;67,28%
Dep3kul;Объект 907;264;3012;73,48%
Dep3kul;T110E4;243;3480;68,72%
Dep3kul;T110E5;209;3269;67,46%
Dep3kul;Т-62А;189;2994;67,72%
Dep3kul;Т-22 ср.;40;2736;62,50%
Dep3kul;113;33;3087;66,67%
Dep3kul;Bat.-Chatillon 25 t;897;3170;68,34%
Dep3kul;AMX 50 B;727;3602;72,63%
Dep3kul;Объект 140;632;3203;71,36%
Dep3kul;TVP T 50/51;589;3355;67,23%
Dep3kul;VK 72.01 (K);272;2923;67,28%
Dep3kul;Объект 907;264;3012;73,48%
Dep3kul;T110E4;243;3480;68,72%
Dep3kul;T110E5;209;3269;67,46%
Dep3kul;Т-62А;189;2994;67,72%
Dep3kul;Т-22 ср.;40;2736;62,50%
Dep3kul;113;33;3087;66,67%
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Чтобы не останавливался на проблемных логинах:
Код:
$logins = FileReadToArray(@ScriptDir & "\logins.txt") ;берем логины из файла
if IsArray($logins) Then
	For $login In $logins
		$url = "http://wotomatic.net/?search=" & $login
		ConsoleWrite("Проверяем " & $url & @CRLF)
		$str = InetRead($url, 1) ;запрашиваем страницу для каждого логина
		$str = BinaryToString($str, 16)
		ConsoleWrite("Получено " & StringLen($str) & @CRLF)
		$tanks10lvl = StringRegExp($str, '<tr class="vehicle vLevel0(.*) </td></tr>', 3) ;парсим список танков 10 лвл
		If IsArray($tanks10lvl) Then
			For $tank In $tanks10lvl
				$name = StringRegExp($tank, '<p><span class="cW">(.*)</span></p><table', 3) ;для каждого танка из списка парсим имя, кол-во боев, урон и процент побед
				$boi = StringRegExp($tank, 'Всего боёв</td><td>(.*)</td></tr><tr><td>Одержано', 3)
				$uron = StringRegExp($tank, 'Средний урон</td><td><span class="c.">(.*)</span></td></tr><tr><td>Средний опыт', 3)
				$pobedy = StringRegExp($tank, '%"><span class="c.">(.*%)</span></td><td class="progressEmpty', 3)
				FileWriteLine(@ScriptDir & "\str2.txt", $login & ";" & $name[0] & ";" & $boi[0] & ";" & $uron[0] & ";" & $pobedy[0]) ;пишем в файл через точку с запятой
			Next
		Else
			FileWriteLine(@ScriptDir & "\str2.txt", $login & ";список танков не получен")			
		EndIf

	Next
Else
	ConsoleWrite("Список логинов не получен" & @CRLF)
	Exit
EndIf
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Изменил строчку,для того,чтобы получать данные за период,но как то он не выдает список танков
Код:
$url = "http://wotomatic.net/?search=" & $login & "&days=130"

при этом
Проверяем http://wotomatic.net/?search=Dep3kul&days=130
Получено 105125
Проверяем http://wotomatic.net/?search=HULK_3472&days=130
Получено 492964
+>00:23:19 AutoIt3.exe ended.rc:0
+>00:23:19 AutoIt3Wrapper Finished.
>Exit code: 0 Time: 21.48
данные о получении есть,но
Dep3kul;список танков не получен
HULK_3472;список танков не получен
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Другой URL --> другая страница --> другой исходный код страницы --> другие регулярные выражения... ;)
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
hedji сказал(а):
Другой URL --> другая страница --> другой исходный код страницы --> другие регулярные выражения... ;)
но код страницы и тд тот же самый
Код:
<p><span class="cW">TVP T 50/51</span></p><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="noBrd"><table border="0" cellpadding="1" cellspacing="0" width="100%"><tr><td>Боёв за период</td><td>3</td></tr><tr><td>Одержано побед</td><td><span class="c1">33,33%</span></td></tr><tr><td>Средний урон</td><td><span class="c6">3765</span></td></tr><tr><td>Средний опыт</td>
 

hedji

Продвинутый
Сообщения
409
Репутация
94
http://wotomatic.net/?search=Dep3kul - строки танков 10лвл начинаются с <tr class="vehicle vLevel0 и заканчиваются progressEmpty"> </td></tr>
http://wotomatic.net/?search=Dep3kul&days=130 - строки танков 10лвл начинаются с <tr class="vehicle vLevel0 НО заканчиваются progress"><span class="c0">NEW</span></td></tr>
По остальным строкам такая же ситуация.
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Вроде все сделал как надо,но список не выдает
Dep3kul;список танков не получен :shok:
проверил строку
Код:
$tanks10lvl = StringRegExp($str, '<tr class="vehicle vLevel0">(.*)progress"><span class="c0">NEW</span></td></tr>'

она выдает единицу,почему не знаю :scratch:

Код:
$logins = FileReadToArray(@ScriptDir & "\logins.txt") ;берем логины из файла
if IsArray($logins) Then
    For $login In $logins
        $url = "http://wotomatic.net/?search=" & $login & "&days=30"
        ConsoleWrite("Проверяем " & $url & @CRLF)
        $str = InetRead($url, 1) ;запрашиваем страницу для каждого логина
        $str = BinaryToString($str, 16)
        ConsoleWrite("Получено " & StringLen($str) & @CRLF)
        $tanks10lvl = StringRegExp($str, '<tr class="vehicle vLevel0">(.*)progress"><span class="c0">NEW</span></td></tr>', 3) ;парсим список танков 10 лвл
	   If IsArray($tanks10lvl) Then
            For $tank In $tanks10lvl
                $name = StringRegExp($tank, '<p><span class="cW(.*)</span></p><table', 3) ;для каждого танка из списка парсим имя, кол-во боев, урон и процент побед
                $boi = StringRegExp($tank, 'Всего боёв</td><td>(.*)</td></tr><tr><td>Одержано', 3)
                $uron = StringRegExp($tank, 'Средний урон</td><td><span class="c.">(.*)</span></td></tr><tr><td>Средний опыт', 3)
                $pobedy = StringRegExp($tank, 'побед</td><td><span class="c6">">(.*%)</span></td></tr><tr><td>Средний', 3)
                FileWriteLine(@ScriptDir & "\str2.txt", $login & ";" & $name[0] & ";" & $boi[0] & ";" & $uron[0] & ";" & $pobedy[0]) ;пишем в файл через точку с запятой
            Next
        Else
            FileWriteLine(@ScriptDir & "\str2.txt", $login & ";список танков не получен")
        EndIf

    Next

	Else

    ConsoleWrite("Список логинов не получен" & @CRLF)
    Exit

EndIf
 
Верх