Что нового

[Автоматизация] Считывание определённого "куска" с URL (часть вторая)

Dk

Новичок
Сообщения
358
Репутация
2
Версия AutoIt: 3.2

На странице http://www.amazon.de/gp/shops/storefront/index.html?ie=UTF8&page=1&sellerID=ALYY2EOZQ7QUK&sortBy=StartDateDesc есть различный товар.

Ссылка на каждый товар выглядит так
http://www.amazon.de/gp/product/3570010511?ie=UTF8&seller=ALYY2EOZQ7QUK&sn=MEDIMOPS
В данном случае номер товара здесь 3570010511. Вобщем если заходить на разные товары, то будет меняться только этот номер.
http://www.amazon.de/gp/product/3570010511?ie=UTF8&seller=ALYY2EOZQ7QUK&sn=MEDIMOPS

Мне нужно что-бы программа считывала эти номера у всех товаров и переходила на следующею страницу. В данном случае страниц всего 1843038.

У меня уже есть похожий скрипт который предназначен для этого же сайта только для другого вида ссылки.
Я уверен можно просто переделать его. Я сам не смог.
Заново скрипт писать не нужно, пожалуйста переделайте по возможности вот этот.

Код:
#include <Array.au3>
#include <File.au3>

HotKeySet('{ESC}', '_Exit')

Global $x = 0

$sUrl = 'http://www.amazon.de/s/ref=nb_sb_noss_2?__mk_de_DE=%C3%85M%C3%85Z%C3%95%C3%91&url=search-alias%3Daps&field-keywords=php'

Dim $aResult2[1]

For $i = 0 To 1000 ; большое число

    $sText = BinaryToString(InetRead($sUrl))
    $aResult1 = StringRegExp($sText, '/dp/(.*?)/ref', 3)
    $aResult1 = _ArrayUnique($aResult1)

    _ArrayConcatenate($aResult2, $aResult1, 1)

    $aResult0 = StringRegExp($sText, 'href="/s/ref=sr_pg_(.*?)">', 3)
    $aResult0[UBound($aResult0) - 1] = StringReplace($aResult0[UBound($aResult0) - 1], 'amp;', '')
    If ($i <> 0 And UBound($aResult0) - 1 = 0) Or $x = 1 Then ExitLoop

    $sUrl = 'http://www.amazon.de/s/ref=sr_pg_' & $aResult0[UBound($aResult0) - 1]

Next

;_ArrayDisplay($aResult2)

_FileWriteFromArray('Log.txt', $aResult2, 1)

Func _Exit()
    $x = 1
EndFunc   ;==>_Exit
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Re: [Автоматизация] Считывание определённого \"куска\" с URL (часть вторая)

Добрый день.
1. 1843038 - это количество не страниц, а товаров. Страниц всего 77449, где на каждой странице по 24 товара. На некоторых меньше.
2. тут переделать придется почти все.


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

Как то так, но не проверял

Код:
#include <Array.au3>
#include <File.au3>
#include <inet.au3>

HotKeySet('{ESC}', '_Exit')

Global $x = 0
Global $pageCount = 1

Dim $aResult1
Dim $aResult2[1]

$sUrl = 'http://www.amazon.de/gp/shops/storefront/index.html?ie=UTF8&page=' & 1 & '&sellerID=ALYY2EOZQ7QUK&sortBy=StartDateDesc'
$sUrl1 = 'http://www.amazon.de/gp/shops/storefront/index.html?ie=UTF8&page='
$sUrl2 = '&sellerID=ALYY2EOZQ7QUK&sortBy=StartDateDesc'
$sUrl = $sUrl1 & $pageCount & $sUrl2


;~ Определяем количество страниц
$hSource	= _INetGetSource($sUrl)
$pageCount	= StringRegExp($hSource, '>(\d*)</a></td>\r', 1)

    $aResult1 = StringRegExp($hSource, 'small.*/gp/product/(.*?)\?ie', 3)
    _ArrayConcatenate($aResult2, $aResult1, 1)

For $i = 2 To $pageCount ; большое число

	$hSource	= _INetGetSource($sUrl1 & $i & $sUrl2)
    $aResult1 = StringRegExp($hSource, 'small.*/gp/product/(.*?)\?ie', 3)
    _ArrayConcatenate($aResult2, $aResult1, 1)

Next

_Exit()

Func _Exit()

    $aResult1 = _ArrayUnique($aResult2)
	_FileWriteFromArray('Log.txt', $aResult2, 1)
	Exit

EndFunc   ;==>_Exit
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
mef-t

Считывает только первую страницу, не осуществляет переход на следующую.
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Поправил.
перенос не так определил и считывал не массивом, а переменной.

Код:
#include <Array.au3>
#include <File.au3>
#include <inet.au3>

HotKeySet('{ESC}', '_Exit')

Global $pageCount = 1
Global $aResult1
Global $aResult2[1]

;~ $sUrl = 'http://www.amazon.de/gp/shops/storefront/index.html?ie=UTF8&page=' & 1 & '&sellerID=ALYY2EOZQ7QUK&sortBy=StartDateDesc'
$sUrl1 = 'http://www.amazon.de/gp/shops/storefront/index.html?ie=UTF8&page='
$sUrl2 = '&sellerID=ALYY2EOZQ7QUK&sortBy=StartDateDesc'
$sUrl = $sUrl1 & $pageCount & $sUrl2

;~ Определяем количество страниц
$hSource	= _INetGetSource($sUrl)
$pageCount	= StringRegExp($hSource, '>(\d+)</a></td>\R', 1) ;ищем номер последней страницы

;~ Сразу ищем книги на первой странице
$aResult1 = StringRegExp($hSource, 'small.*/gp/product/(.*?)\?ie', 3)
_ArrayConcatenate($aResult2, $aResult1, 1)

For $i = 2 To $pageCount[0] ; перебираем все страницы начиная со второй

	$hSource	= _INetGetSource($sUrl1 & $i & $sUrl2)
    $aResult1 = StringRegExp($hSource, 'small.*/gp/product/(.*?)\?ie', 3)
    _ArrayConcatenate($aResult2, $aResult1, 1)

Next

_Exit()

Func _Exit()

    $aResult1 = _ArrayUnique($aResult2)
	_FileWriteFromArray('Log.txt', $aResult2, 1)
	Exit

EndFunc   ;==>_Exit
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Всё работает супер!

Есть только 2 маленькие просьбы.
Считывание номеров может занять примерно 20 часов. Можно сделать табло на котором будет видно сколько номеров программа уже прошла, что бы я знал примерно на каком я этапе. Вторая просьба, что бы запись в текстовой файл шла не по окончанию программы, а во время, так как вероятность того, что будет сбой (с соединением) большая, и время может быть в пустую потрачено.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Dk
У Amazon есть Amazon Product Advertising API. IMHO если его использовать, работать будет удобнее ;)
Результат возвращается в XML формате.

Вид запроса:
Код:
http://ecs.amazonaws.de/onca/xml?AWSAccessKeyId=[myAccessKey]&IdType=ASIN&ItemId=B002UD52WQ&Operation=ItemLookup&ResponseGroup=Offers&Service=AWSECommerceService&Timestamp=2010-07-27T23:17:57.000Z&Signature=[mySignature]
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Garrett

Да я знаю, но в данном случае здесь нельзя применить.
Можно вытаскивать Цены, размер, номер итд.

Но Что бы вытащить все номера именно у определённого магазина... я тут даже и не знаю с чего начать.
И максимум запросов по АПИ можно делать до 5 тыс в час, потом обрубают (если не заробатывaешь для амазона, там своя таблица есть и на ней показано сколько максимум запросов можно сделать...)А мне нужно прочитать около миллиона. по АПИ меня забанят за нагрузку сервера. А если по простой сiстеме, то можно легко 300 тыс за пару часов и не кто не блокирует. вообщем это не совсем удобно для меня.

Возможно я ошибаюсь, но вот это уже устарело

http://ecs.amazonaws.de/onca/xml?AWSAccessKeyId=[myAccessKey]&IdType=ASIN&ItemId=B002UD52WQ&Operation=ItemLookup&ResponseGroup=Offers&Service=AWSECommerceService&Timestamp=2010-07-27T23:17:57.000Z&Signature=[mySignature]

так как для использования всех апи нужно 3 ключа от амазона. это нововведение с 2012 года вроде, а документация там в основном с 2009 года и просто не актуальна Здесь я вижу только 2.
[mySignature]
[myAccessKey]

У вас есть опыт с API от амазона?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Dk [?]
У вас есть опыт с API от амазона?
Нет, я с ним не работал, но почитав я понял что ничего сложного нет. Посылаете GET запрос где указываете список параметров (кстати ItemId=B002UD52WQ можно указывать не один), и получите ответ в виде XML. Потом с помощью MSXML2.DOMDocument разбираете документ.
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Garrett

Я знаю все эти функции, просто в моём случае это не применимо.
я же ничего не Могу указать, так как не знаю, что есть в магазине у прадовца. Поэтому только через УРЛ.
Если бы я хотел узнат Цену, размер, цвет с помощью номера, то тогда да, но я же не знаю номеров, я именно как раз их и пытгаюсь получить.

Но вообще спасибо :smile:
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re: [Автоматизация] Считывание определённого \\\\\\\"куска\\\\\\\" с URL (часть вторая)

Добавте пожалуйста вот эти две функции ещё

Добавьте пожалуйста вот эти две функции ещё
Счётчик номеров
И Запись номеров во время работы программы, а не по завершению.
Пожалуйста :'(


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

Ладно, сделал сам :smile: :-[


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





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

Есть маленькая проблема.
Первый артикул-товар на каждой странице не видит - не записывает.
Что это может быть.
Вот скрипт, который выше был, только немного усовершенствованный (как смог).

Код:
#include <Array.au3>
#include <File.au3>
#include <inet.au3>


HotKeySet('{ESC}', '_Exit')

Global $pageCount = 1
Global $aResult1
Global $aResult2[1]
Global $i2
Global $Seite
Local $Seitenfile = FileOpen("log1.txt", 1)
Local $ASINfile = FileOpen("log.txt", 1)
Local $iTimer, $iSec,$iX,$iY
Local $hTimer = TimerInit(), $iTimer = 0

;~ $sUrl = 'http://www.amazon.de/gp/shops/storefront/index.html?ie=UTF8&page=' & 1 & '&sellerID=AA8KICS1PHF7ZO&sortBy=StartDateDesc'
$sUrl1 = 'http://www.amazon.de/gp/shops/storefront/index.html?ie=UTF8&page='
$sUrl2 = '&sellerID=A8KICS1PHF7ZO&sortBy=StartDateDesc'
$sUrl = $sUrl1 & $pageCount & $sUrl2

;~ Определяем количество страниц
$hSource    = _INetGetSource($sUrl)
$pageCount  = StringRegExp($hSource, '>(\d+)</a></td>\R', 1) ;ищем номер последней страницы

;~ Сразу ищем книги на первой странице
$aResult1 = StringRegExp($hSource, 'small.*/gp/product/(.*?)\?ie', 3)
_ArrayConcatenate($aResult2, $aResult1, 1)
$Seite = FileReadLine("log1.txt", -1)
For $i = $Seite To $pageCount[0] ; перебираем все страницы начиная со второй
    
	Dim $aResult2[1]
    
	$hSource    = _INetGetSource($sUrl1 & $i & $sUrl2)
    $aResult1 = StringRegExp($hSource, 'small.*/gp/product/(.*?)\?ie', 3)
    _ArrayConcatenate($aResult2, $aResult1, 1)
    
	$iTimer = Round(TimerDiff($hTimer)/1000,0)
        ToolTip($i & " Прошло "&$iTimer&" из "&$iSec&" секунд...",8,1007)
    
	 FileWriteLine($Seitenfile,$i)
	$aResult1 = _ArrayUnique($aResult2)
    _FileWriteFromArray($ASINfile, $aResult2, 1)
Next

_Exit()

Func _Exit()

    $aResult1 = _ArrayUnique($aResult2)
    _FileWriteFromArray('Log3.txt', $aResult2, 1)
    Exit

EndFunc   ;==>_Exit
 
Верх