Amazon izdelki - scrape podatkov s PHP

Kako bi iz Amazon strani za določen izdelek izluščil podatke o:

Povprečni oceni (x stars out of 5)
Številu ocenjevalcev (customer reviews)

Sam sem uporabil tole kodo:

<?php
$source=file_get_contents("http://www.amazon.com/dp/B002FQJT3Q/");
preg_match("/title=\"(.*?) out of 5 stars/",$source, $result);
$par1=$result[1];
echo '<u>Rating on Amazon.com:    '.$par1.' out of 5 stars</u><br>';
?>

Stvar je delovala 1 dan, sedaj pa se izpiše napaka:

Warning: filegetcontents(http://www.amazon.com/dp/B002FQJT3Q/) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable

Blokada s strani Amazona?

18 odgovorov

Probaj iz mtancejevega primera odstraniti useragent, me prav zanima če je to to :)

Tudi brez useragent je v redu.

Razlog sem napisal v enem post prej.

Torej, najbrž je problem v konfiguraciji PHP-ja in imaš izklopljeno funkcijo filegetcontents, mislim, da je to v "paketu" z fopen - ne me držat za besedo.

Hvala obema za pomoč.

Vseeno čudno, da mu je kar naenkrat nehalo delati :)

@mtance Sem še malo poizkušal in po mojem mora biti nekaj v zvezi z Amazonom. Ker če poizkusim enako skripto (z drugim regexom) na moji strani, potem dela.

Jaz sem dal njegovo kodo na moj strežnik in mi isto pokaže error. Je pa itak malo morje možnosti, kaj je :)

Končno sem spacal skupaj skripto, pri čemer mi je bil v veliko pomoč namig od @mtance. Skripta iz MySql tabele prebere Amazon ASIN kode, z Amazon strain podatke o ceni, ocenah in številu ocen ter dobljene podatke zapiše v isto tabelo. Prilagam kodo:

<?php

$con = mysql_connect("localhost:3306","user","pass");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("db", $con);

$query="SELECT asin from amazon where asin<>''";
$result2 = mysql_query($query);

while($row = mysql_fetch_array($result2))
{

$asin=$row['asin'];

if (function_exists('curl_init')) {
// initialize a new curl resource
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.amazon.com/dp/'.$asin);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0');

$source = curl_exec($ch);

curl_close($ch);
} else {
echo "Error, you don't have support for cURL";
}

preg_match("/title=\"(.*?) out of 5 stars/",$source, $result);
$stars=$result[1];

preg_match("/priceLarge\">(.*?)</",$source, $result);
$price=trim($result[1],"$");
$price=trim($result[1],"$");

preg_match("/1\" \>See all (.*?) customer reviews/",$source, $result);
$reviews=$result[1];

echo 'ASIN: '.$asin.'<br>';
echo 'Rating on Amazon.com: '.$stars.' out of 5 stars<br>';
echo 'Price: '.$price.'<br>';
echo 'Customer reviews: '.$reviews.'<br><br>';

$query="UPDATE amazon set stars=".$stars.",price2='".$price."',
reviews='See all ".$reviews." reviews' where asin='".$asin."'";

mysql_query($query);
}
$query="UPDATE amazon set price=price2 where asin<>'' and price2 > 0";
mysql_query($query);

mysql_close($con);

?>

Vem da je to PHP skropucalo ampak moj materni jezik je SQL. PHP skripta tako deluje le za izdelke ki imajo točno določeno ceno, ne dela pa za izdelke kot so na primer tile:

Več modelov različnih barv...
http://www.amazon.com/dp/B0047DVWLW

Variabilna cena (Price from)
http://www.amazon.com/dp/B004NNVHUC

Cena vidna le v košarici (See price in cart)
http://www.amazon.com/dp/B00422TXZA

Bi znal kdo pomagat, lahko tudi proti plačilu.

2