Что нового

Многоадресный поиск в web и сведение результатов в одну таблицу

Alexaut

Новичок
Сообщения
23
Репутация
1
Вот такой код для вывода адресов иконок с веб-странички и ввода их в Excel (спасибо madmasles и axlwor).

Код:
#include "IE.au3"
#include "Array.au3"
#include <Excel.au3>

$sUrl = 'http://www.photosight.ru/users/208022/' ; Здесь один адрес. А как задать многоадресный ввод из Excel по адресам, записанным в столбце, и все результат поиска свести в одну таблицу?

$iCount = 0
$oIE = _IECreate($sUrl)
$oPics = _IETagNameGetCollection($oIE, 'img')
Dim $aIMG[@extended + 1][2]
For $oPic In $oPics
    If StringRegExp($oPic.src, '\.jp[eg]{1,2}') Then
        $iCount += 1
        $aIMG[$iCount][0] = $oPic.src
        $aIMG[$iCount][1] = $oPic.alt
    EndIf
Next

$oExcel = _ExcelBookNew() 
_ExcelWriteSheetFromArray ($oExcel, $aIMG, 1, 1, 0, 0)
_ExcelBookSaveAs($oExcel, @ScriptDir & "\~~~Temp.xls", "xls", 0, 1)


В нем задан один адрес. А как задать многоадресный ввод из Excel по адресам, записанным в столбце, и все результаты поиска свести в один файл Excel?


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

Вот файл с адресами для примера...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Alexaut [?]
Вот файл с адресами для примера
В файле записан результат работы скрипта. А что в итоге надо, я пока не понял.
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
madmasles

Прошу прощения! - поменял. Предполагается, что в файле Excel до сотни адресов веб-страниц, из которых представленным кодом вынимаются адреса иконок и записываются одним экселовским файлом. - То есть у меня не получается автоматизировать ввод адресов страниц и сбор адресов иконок.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Alexaut,
Полученные ссылки в какой файл Excel сохранять? Ссылки нужны только на маленькие картинки, а то там еще и на большие есть?
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
madmasles

В какой файл Excel сохранять - это не принципиально - можно в новый, можно в этот же на новой странице. Адреса всех картинок - маленьких и побольше, которые код определяет, достаточна вместе свести в один столбик - их там по 33-34 в этих примерах. Большие (юзерпики) позволят потом рассортировать базу.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Alexaut,
Могу попробовать сделать следующее:
- получаем ссылки на маленькие и большие картинки, подписи;
- скачиваем маленькие картинки, вставляем их в Excel (лист называем по имени пользователя);
- на картинки в Excel вешаем гиперссылки на большие картинки.

Примерно, как в прикрепленном файле (только в нем пока нет гиперссылок на большие картинки)
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
madmasles
Это слишком круто! :smile: На самом деле на этом этапе картинки в Excel вытаскивать не надо, - только все адреса иконок свести в один столбик, - пример вставляю. А вытаскивать иконки, - это уже позже, после предварительной обработки базы.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Alexaut,
Попробуйте так (у меня работает). должно делать:
- прочитать в массив ссылки из файла @ScriptDir & '\adresa_test.xls', имя листа по умолчанию Ссылки;
- получить в массив ссылки на картинки и подписи к ним с сайта;
- сохранить все это в файл @ScriptDir & '\Save.xls' на лист с именем автора. Если файла нет, то он будет создан, если лист с автором уже есть, то новые строки будут добавлены ниже существующих.

Проверку на макс кол-во строк не делал.
Код:
#include <Excel.au3>
;#include <Array.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $sFileExcel_Links = @ScriptDir & '\adresa_test.xls', $aUrl, $aInfo, _
		$sFileSave = @ScriptDir & '\Save.xls'


$aUrl = _Get_UrlExcel($sFileExcel_Links)
Switch @error
	Case -1
		MsgBox(16, 'Error', 'Отсутствует файл' & @LF & $sFileExcel_Links)
		Exit
	Case 1
		MsgBox(16, 'Error', '_Get_UrlExcel')
		Exit
EndSwitch
;_ArrayDisplay($aUrl)
For $i = 1 To $aUrl[0]
	$aInfo = _Get_InfoArray($aUrl[$i])
	If @error Then ContinueLoop
	;_ArrayDisplay($aInfo, $i & ' (' & $aUrl[0] & ')')
	_SaveExcel($sFileSave, $aInfo)
	If @error Then
		MsgBox(16, 'Error', '_SaveExcel')
	EndIf
Next
MsgBox(64, 'Info', 'OK :)')


Func _Get_UrlExcel($s_FileExcel, $s_Sheet = 'Ссылки')
	Local $o_Excel, $a_TempArray, $a_Return_Array, $i_Count, $i_Error = 1, _
			$s_ControlUrl = 'http://www.photosight.ru/users/'

	If Not FileExists($s_FileExcel) Then Return SetError(-1)
	$o_Excel = _ExcelBookOpen($s_FileExcel, 0)
	If @error Then Return SetError(1)
	For $i = 1 To 1
		_ExcelSheetActivate($o_Excel, $s_Sheet)
		If @error Then ExitLoop
		$a_TempArray = _ExcelReadSheetToArray($o_Excel)
		If @error Then ExitLoop
		$i_Error = 0
	Next
	_ExcelBookClose($o_Excel)
	If $i_Error Then Return SetError(1)
	Dim $a_Return_Array[$a_TempArray[0][0] + 1]
	For $i = 1 To $a_TempArray[0][0]
		For $j = 1 To $a_TempArray[0][1]
			If StringRegExp($a_TempArray[$i][$j], '^' & $s_ControlUrl) Then
				$i_Count += 1
				$a_Return_Array[$i_Count] = $a_TempArray[$i][$j]
			EndIf
		Next
	Next
	If Not $i_Count Then Return SetError(1)
	ReDim $a_Return_Array[$i_Count + 1]
	$a_Return_Array[0] = $i_Count
	Return $a_Return_Array
EndFunc   ;==>_Get_UrlExcel

Func _Get_InfoArray($s_Url)
	Local $s_Sourse, $i_Flag = 1, $a_TempArray, $a_Return_Array, $i_Count, $s_Url_big, _
			$s_Url_small, $s_Alt, $s_Nick

	$s_Sourse = InetRead($s_Url, 17)
	If @error Then Return SetError(1)
	If StringInStr($s_Sourse, Hex(StringToBinary(StringLower('UTF-8')))) Then $i_Flag = 4
	$s_Sourse = BinaryToString($s_Sourse, $i_Flag)
	$a_TempArray = StringRegExp($s_Sourse, '(?s)<a\s+id="photo_(.*?)</a>', 3)
	If @error Then Return SetError(1)
	Dim $a_Return_Array[UBound($a_TempArray) + 1][3]
	For $i = 0 To UBound($a_TempArray) - 1
		$s_Url_big = StringRegExpReplace($a_TempArray[$i], '(?s).*href="(.*?)"><.*', 'http://www.photosight.ru$1')
		If @extended <> 1 Then ContinueLoop
		$s_Url_small = StringRegExpReplace($a_TempArray[$i], '(?s).*src="(.*?)"\s+alt.*', '$1')
		If @extended <> 1 Then ContinueLoop
		$s_Alt = StringRegExpReplace($a_TempArray[$i], '(?s).*alt="(.*?)"\s+/>.*', '$1')
		If @extended <> 1 Then ContinueLoop
		$i_Count += 1
		$a_Return_Array[$i_Count][0] = $s_Url_big
		$a_Return_Array[$i_Count][1] = $s_Url_small
		$a_Return_Array[$i_Count][2] = $s_Alt
	Next
	If Not $i_Count Then Return SetError(1)
	ReDim $a_Return_Array[$i_Count + 1][3]
	$a_Return_Array[0][0] = $i_Count
	$s_Nick = StringRegExpReplace($s_Sourse, '(?s).*<title>.*?пользователя\s+(.*?)\s+-\sPhoto.*', '$1')
	If @extended = 1 Then
		$a_Return_Array[0][1] = $s_Nick
	Else
		$a_Return_Array[0][1] = StringRegExpReplace($s_Url, '.*users/(\d+)/.*', '$1')
	EndIf
	Return $a_Return_Array
EndFunc   ;==>_Get_InfoArray

Func _SaveExcel($s_FileSave, $a_Array)
	Local $o_Excel, $f_Exist, $s_Name_Sheet, $aSheet, $i_RowPlus, $f_SheetExist

	$s_Name_Sheet = StringRegExpReplace($a_Array[0][1], '[^а-яА-ЯёЁ\w\s-()]', '')
	If FileExists($s_FileSave) Then
		$f_Exist = True
		$o_Excel = _ExcelBookOpen($s_FileSave, 0)
	Else
		$o_Excel = _ExcelBookNew(0);(0)
	EndIf
	If @error Then Return SetError(1)
	For $i = 1 To 1
		If $f_Exist Then
			$aSheet = _ExcelSheetList($o_Excel)
			If @error Then ExitLoop
			For $j = 1 To $aSheet[0]
				If $aSheet[$j] == $s_Name_Sheet Then
					_ExcelSheetActivate($o_Excel, $s_Name_Sheet)
					If @error Then ExitLoop 2
					$i_RowPlus = $o_Excel.Application.ActiveCell.Row
					$f_SheetExist = True
					ExitLoop
				EndIf
			Next
			If Not $f_SheetExist Then
				_ExcelSheetAddNew($o_Excel, $s_Name_Sheet)
				If @error Then ExitLoop
				_ExcelSheetMove($o_Excel, $s_Name_Sheet, $aSheet[0] + 1, False)
				If @error Then ExitLoop
				_ExcelSheetActivate($o_Excel, $s_Name_Sheet)
				If @error Then ExitLoop
			EndIf
		Else
			_ExcelBookSaveAs($o_Excel, $s_FileSave)
			If @error Then ExitLoop
			$aSheet = _ExcelSheetList($o_Excel)
			If @error Then ExitLoop
			If $aSheet[0] > 1 Then
				For $j = 2 To $aSheet[0]
					_ExcelSheetDelete($o_Excel, $aSheet[$j])
					If @error Then ExitLoop 2
				Next
				_ExcelSheetNameSet($o_Excel, $s_Name_Sheet)
				If @error Then ExitLoop
			EndIf
		EndIf
		For $j = 1 To $a_Array[0][0]
			_ExcelWriteCell($o_Excel, $j + $i_RowPlus & '.', $j + $i_RowPlus, 1)
			_ExcelHyperlinkInsert($o_Excel, $a_Array[$j][1], $a_Array[$j][1], $a_Array[$j][2], $j + $i_RowPlus, 2)
			If @error Then ExitLoop
			_ExcelHyperlinkInsert($o_Excel, $a_Array[$j][0], $a_Array[$j][0], $a_Array[$j][2], $j + $i_RowPlus, 3)
			If @error Then ExitLoop
		Next
	Next
	If Not @error Then
		$o_Excel.Columns('A:C' ).EntireColumn.AutoFit
		_ExcelBookClose($o_Excel)
	EndIf
	Return SetError(@error)
EndFunc   ;==>_SaveExcel
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
madmasles
У меня выдает ошибку - "_Get_UrlExcel"
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Alexaut [?]
У меня выдает ошибку - "_Get_UrlExcel"
Какое имя у листа со ссылками? Скрипт еще проверяет наличие в ссылке текста _http://www.photosight.ru/users/ (без _).
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
Файл Excel тот же самый, что взят нами для теста (adresa_test2.xls), имя поменял на adresa_test.xls и находится он в папке с кодом. Имя листа со ссылками "Лист1", в нем 7 адресов:

http://www.photosight.ru/users/208022/
http://www.photosight.ru/users/208022/?pager=2
http://www.photosight.ru/users/208022/?pager=3
http://www.photosight.ru/users/192327/
http://www.photosight.ru/users/192327/?pager=2
http://www.photosight.ru/users/192327/?pager=3
http://www.photosight.ru/users/192327/?pager=4



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

Понял, - сейчас поменяю имя листа
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
madmasles

Работает! :smile:

Огромная работа - огромное спасибо!

В коде гораздо больше, чем я ожидал.

Для меня, как начинающего и пытающегося освоить AutoIt, самое сложное в том, что этот код сделан практически с нуля. То, что мне удалось понять в изначально представленном коде, который берет один адрес, достает информацию со странички и записывает его в Excel - здесь это в явном виде не представлено - все написано по-новой.

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

1) ввод адресов страниц из списка

... <последовательная работа с каждым адресом ранее созданного кода (выбор адресов иконок)> ...

2) вывод общего списка адресов снятых иконок (для простоты в одну колонку на одном листе).

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

Еще раз БОЛЬШОЕ спасибо!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Alexaut [?]
для простоты в одну колонку на одном листе
ИМХО, на каждого автора свой лист - удобнее. Если Вам что-то непонятно в коде, Вы спрашивайте.
madmasles [?]
- скачиваем маленькие картинки, вставляем их в Excel (лист называем по имени пользователя);
- на картинки в Excel вешаем гиперссылки на большие картинки.
Делать?
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
madmasles

Конечно, удобнее! - как пользователь я на 7 небе, как обучающийся - пока что в ауте :smile:
Картинки в Excel вводить не надо. Я соберу базу и отселектирую нужные, - потом, наверно, обращусь за помощью как автоматизировать их ввод в страничку. - Спасибо!
 
Верх