2014-02-18 41 views
12

我試圖使用HTML DOM解析器獲取「主」產品圖像的圖像源,無論解析器指向哪個產品頁面。嘗試使用HTML DOM解析器獲取Amazon頁面上的主圖像

在每個頁面上,似乎該圖像的ID爲「landingImage」。 你會認爲這應該做的伎倆:

$finalarray[$i][2] = $html->find('img[id="landingImage"]', 0)->src; 

但沒有這樣的運氣。

我也試過

foreach($html->find('img') as $e) 
    if (strpos($e,'landingImage') !== false) { 
     $finalarray[$i][2] = $e->src; 
    } 

我注意到,平時的圖像源具有SY300或SX300所以我這樣做:

foreach($html->find('img') as $e) 
    if (strpos($e,'SX300') !== false) { 
     $finalarray[$i][2] = $e->src; 
    } 
    else if (strpos($e,'SY300') !== false) { 
     $finalarray[$i][2] = $e->src; 
    } 

不幸的是一些圖像源鏈接不包含,例如:

http://www.amazon.com/gp/product/B001O21H00/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B001O21H00&linkCode=as2&tag=bmref-20 
+3

亞馬遜的API – 2014-02-18 01:27:17

+0

袞,你需要一個亞馬遜子公司使用該API,他們是討厭接受網站在起步階段 –

+0

賞金「沒有足夠的重視。」亞馬遜鏈接與關聯'標籤'在後。不是一個問號。腥 – guest

回答

4

使用亞馬遜API可能是更好的解決方案,但這不是問題。

當我從示例網頁(無需運行JavaScript的內容)下載html時,我找不到id="landingImage"[1]的任何標記。但我可以找到一個帶有id="main-image"的圖片標籤。嘗試使用DOMDocument提取此標記不成功。不知何故方法loadHTML()loadHTMLFile()不能解析的HTML。

但有趣的部分可以用正則表達式提取。下面的代碼會給你的圖像來源:

$url = 'http://www.amazon.com/gp/product/B001O21H00/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B001O21H00&linkCode=as2&tag=bmref-20'; 
$html = file_get_contents($url); 

$matches = array(); 
if (preg_match('#<img[^>]*id="main-image"[^>]*src="(.*?)"[^>]*>#', $html, $matches)) { 
    $src = $matches[1]; 
} 

// The source of the image is 
// $src: 'http://ecx.images-amazon.com/images/I/21JzKZ9%2BYGL.jpg' 

[1] HTML源代碼是PHP內下載與功能file_get_contents。使用Firefox下載html源代碼會產生不同的html代碼。在最後一種情況下,您會發現一個ID屬性爲「landingImage」的圖像標籤(JavaScript未啓用!)。看起來下載的html源代碼取決於客戶端(http請求中的頭文件)。

1

在您的示例img標籤id="landingImage"的頁面中不包含屬性src。該屬性由JavaScript添加。

但是這個標籤包含屬性data-a-dynamic-image與價值{"http://ecx.images-amazon.com/images/I/21JzKZ9%2BYGL.jpg":[200,200]}

你可以試試這個屬性中獲得價值,然後就解析值。通過正則表達式或strpos和substr函數。

+0

你將如何運行PHP內的JavaScript? – Henrik

+0

@Henrik我沒有在PHP中運行JavaScript。我只是比較瀏覽器中的HTML和頁面和HTML(在螢火蟲內) – newman

1

看起來不是每個頁面都使用相同的html。您將需要檢查許多可能性並記錄未找到圖像的情況,以便您可以添加對它們的支持。例如:

$url = 'http://www.amazon.com/gp/product/B001O21H00/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B001O21H00&linkCode=as2&tag=bmref-20'; 

$html = file_get_html($url); 

$image = $html->find('img[id="landingImage"]', 0); 

if(!is_object($image)) { 
    $image = $html->find('img[id="main-image"]', 0); 
} 

if(!is_object($image)) { 
    // Log the error to apache error log 
    error_log('Could not find amazon image: ' + $url); 
} else { 
    print $image->src; 
} 
相關問題