PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (PHP) - Amazon Crawling



Uranjitsu
03.12.2016, 11:32
Hallo zusammen,

ich versuche gerade das Image von Amazon auszulesen, allerdings wird mir nichts angezeigt.
Der Preis ist auslesbar.
Hat jemand eine Idee?

Hier der Code:


function get_data($url)
{
/* do some curl magic */
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

function get_match($regex, $content, $pos = 1)
{
/* do your job */
preg_match($regex, $content, $matches);
/* return our result */
return $matches[intval($pos)];
}

function amazonCrawler($url)
{
/* grab some data */
$amazon_content = get_data($url);
$amazon['price'] = @get_match('!<span id="priceblock_ourprice" class="a-size-medium a-color-price">(.+)</span>!iUm', $amazon_content);
$amazon['image'] = @get_match('/<div id="imgTagWrapperId" class="imgTagWrapper" style="(.*?)">.*?<img alt="(.*?)" src="(.*?)" data-old-hires="(.*?)" class="(.*?)" id="landingImage" data-a-dynamic-image="(.*?)" style="(.*?)">.*?<\/div>/s', $amazon_content, 3);

$array = array(
$amazon['price'],
$amazon['image']
);
return ($array);
}

list($amazon['price'], $amazon['image']) = amazonCrawler('https://www.amazon.de/Sony-Kompaktkamera-Klarbild-Zoom-Weitwinkelobjektiv-Bildstabilisator/dp/B00W46KQ5W/ref=s9_ri_gw_g23_i1_r?pf_rd_m=A3JWKAKR8XB7XF&pf_rd_s=&pf_rd_r=XDZ21RBKDZZXXCAT2CMK&pf_rd_t=36701&pf_rd_p=c3435e44-81b4-4c2f-9f8b-9b818660cb26&pf_rd_i=desktop');

echo "22222<br /><br />";
echo "Preis: ".$amazon['price']."<br />";
echo "Image: ".$amazon['image'];


LG

Nimbus
03.12.2016, 12:18
Ich hab mir das mal angeschaut. Die Antwort ist (oh Wunder), dass der 2. RegEx falsch ist :P

Eventuell hast du dir den HTML-Source nicht so angeschaut, wie ihn deine cURL Funktion bekommt (der style Tag kommt z.B. bei mir ganz am Ende)
Vielleicht sind aber auch die Amazon Seiten sind nicht immer identisch aufgebaut (es wäre denkbar, dass je nach Produkt ein leicht anderer Aufbau gewählt wird)

Amazon Crawling auf diese Art und Weise dürfte onehin wenig Spaß machen, denn es dürfte recht zügig das Bot-Schutz-Captcha kommen.

1stAid
03.12.2016, 19:41
data-old-hires="https://images-na.ssl-images-amazon.com/images/I/61sJVMWE%2BKL._SL1320_.jpg"
Du hast viel regex für etwas Bild;
als flag setze sigel-line
(?<=data-old-hires=\")(.*?)(?=\")
https://regex101.com/r/UJo9aJ/1
trifft.
Wenn du ein anderes format brauchst kannst du dir den link "bauen" da die immer gleich aufgebaut werden z.B.
https://images-na.ssl-images-amazon.com/images/I/61sJVMWE%2BKL._AC_US480_.jpg
für ein pic mit 480 pixeln.

In meinem Amazon(pic)crawler mache ich das seit Jahren ähnlich....

bobby
03.12.2016, 21:22
die preise liegen auf amazon.de, die images auf s3.. sind zwei domains und bei https haste wohl ein Konflikt in deiner config. würde ich aus dem Stehgreif schreiben.

Certain
04.12.2016, 03:57
mhh ist jetzt etwas spät.
Morgen kann ich da genaur reinschauen.

Aber probier doch mal <img id="landingImage"> auszulesen, vielleicht klappt das

Uranjitsu
04.12.2016, 09:24
data-old-hires="https://images-na.ssl-images-amazon.com/images/I/61sJVMWE%2BKL._SL1320_.jpg"
Du hast viel regex für etwas Bild;
als flag setze sigel-line
(?<=data-old-hires=\")(.*?)(?=\")
https://regex101.com/r/UJo9aJ/1
trifft.
Wenn du ein anderes format brauchst kannst du dir den link "bauen" da die immer gleich aufgebaut werden z.B.
https://images-na.ssl-images-amazon.com/images/I/61sJVMWE%2BKL._AC_US480_.jpg
für ein pic mit 480 pixeln.

In meinem Amazon(pic)crawler mache ich das seit Jahren ähnlich....

Danke, das hat wunderbar geholfen :)



function get_data($url)
{
/* do some curl magic */
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

function get_match($regex, $content, $pos = 1)
{
/* do your job */
preg_match($regex, $content, $matches);
/* return our result */
return $matches[intval($pos)];
}

function amazonCrawler($url)
{
/* grab some data */
$amazon_content = get_data($url);
$amazon['price'] = @get_match('!<span id="priceblock_ourprice" class="a-size-medium a-color-price">(.+)</span>!iUm', $amazon_content);
preg_match_all('/(?<=data-old-hires=\")(.*?)(?<=\")/s', $amazon_content, $amazon['image']);

$array = array(
$amazon['price'],
$amazon['image'][0][1]
);
return ($array);
}

list($amazon['price'], $amazon['image'][0][1]) = amazonCrawler('https://www.amazon.de/MSI-GE72-6QD161-Notebook-6700HQ-Skylake/dp/B015CJQAFM/ref=lp_4368994031_1_1?s=computers&ie=UTF8&qid=1480761465&sr=1-1');

echo "111111<br /><br />";
echo "Preis: ".$amazon['price']."<br />";
echo "Image: ".str_replace('"', '', $amazon['image'][0][1])."<br />";