2010-12-30 2 views
0

Grüße. Ich habe ein PHP-Skript, das die Website eines Großhändlers für Produktinformationen abkratzen und diese Informationen in eine Datenbank eingeben soll."Versuchen, Eigenschaft von Nicht-Objekt zu erhalten", wenn Datenbankprüfungen durchgeführt werden - PHP

Ich habe erfolgreich alle Informationen für ein Beispielprodukt gesammelt, und wenn Sie ein einfaches Echo aller $ v Variablen machen, wird alles korrekt auf den Bildschirm ausgegeben.

Jetzt, nachdem ich den Scheck zu sehen, ob die Kategorien der Produkte gibt es in der Datenbank hinzufügen, und tatsächlich die Informationen einfügen, ich

[phpBB Debug] PHP Notice: in file /rip.php on line 35: Trying to get property of non-object [phpBB Debug] PHP Notice: in file /rip.php on line 36: Trying to get property of non-object [phpBB Debug] PHP Notice: in file /rip.php on line 38: Undefined offset: 3 [phpBB Debug] PHP Notice: in file /rip.php on line 38: Undefined offset: 2 [phpBB Debug] PHP Notice: in file /rip.php on line 41: Trying to get property of non-object Fatal error: Call to a member function find() on a non-object in /XXXXX/public_html/XXXXX/rip.php on line 42

jedoch alle Angaben des Produkts noch eingegangen wird die Datenbank.

Das Skript soll Seite für Seite gehen, Informationen sammeln, aber stoppt nach dem ersten Produkt.

I SC bin mit Chens einfachen HTML-DOM Schaber Skript (http://sourceforge.net/projects/simplehtmldom/) und Core-System phpBB für Datenbank-Anrufe, und hier ist meine PHP Quelle:

<?php 

define('IN_PHPBB', true); 
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './'; 
$phpEx = substr(strrchr(__FILE__, '.'), 1); 
include($phpbb_root_path . 'common.' . $phpEx); 
include($phpbb_root_path . 'includes/simple_html_dom.' . $phpEx); 

// Start session management 
$user->session_begin(); 
$auth->acl($user->data); 
$user->setup(); 

function save($in, $out) 
{ 
    $tempDir = './rip_images'; 
$finalDir = $out; 
$imageUrl = $in; 

$file = basename($imageUrl); 

exec("cd $tempDir && wget --quiet $imageUrl"); 

if (rename("$tempDir/$file", "$finalDir") === false) { 
    die('Failed while trying to move image file from temp dir to final dir'); 
} 
} 

function scrape($i) 
{ 
$html = file_get_html('XXXXXXXXX.com/index.php?main_page=product_info&products_id='.$i.'&zenid=e4b7dde8de02e1df005d4549e2e3e529'); 

foreach($html->find('body') as $html) 
{ 
    $item['title'] = trim($html->find('#productName', 0)->plaintext); 
    $item['price'] = trim($html->find('#productPrices', 0)->plaintext); 
    $item['cat'] = $html->find('#navBreadCrumb', 0)->plaintext; 
    list($home, $item['cat'], $item['subcat'], $title) = explode("::", $item['cat']); 
    $item['cat'] = str_replace("&nbsp;", "", $item['cat']); 
    $item['subcat'] = str_replace("\n", "", str_replace("&nbsp;", "", $item['subcat'])); 
    $item['desc'] = trim($html->find('#productDescription', 0)->plaintext); 
    $item['model'] = $html->find('ul#productDetailsList', 0)->find('li', 0)->plaintext; 
    $item['model'] = explode(":", $item['model']); 
    $item['model'] = trim($item['model'][1]); 
    $item['manufacturer'] = $html->find('ul#productDetailsList', 0)->find('li', 1)->plaintext; 
    $item['manufacturer'] = explode(":", $item['manufacturer']); 
    $item['manufacturer'] = trim($item['manufacturer'][1]); 
    foreach($html->find('img') as $img) 
    { 
    if($img->alt == $item['title']) 
    { 
    $item['img_sm'] = $img->src; 
    $thumb_width = $img->width; 
    $thumb_height = $img->height; 
    } 
    } 

    $sm_img_src = "http://XXXXXXXXXX.com/".$item['img_sm']; 
    $lg_img_src = "http://XXXXXXXXXX.com/index.php?main_page=popup_image&pID=".$i; 

    $ext = strrchr($item['img_sm'], '.'); 

    $filename = $item['model'] . $ext; 
    $new_sm = "./rip_images/small/{$filename}"; 
    $new_lg = "./rip_images/large/{$filename}"; 

    $item['image'] = $filename; 

    $file = file_get_contents($lg_img_src); 
    $f = fopen($new_lg,'w+'); 
    fwrite($f,$file); 
    fclose($f); 

    save($sm_img_src,$new_sm); 

    $ret[] = $item; 
} 

$html->clear(); 
unset($html); 

return $ret; 
} 

$i = 1; 
$end = 9999999; 

while($i < $end) 
{ 
$ret = scrape($i); 

foreach($ret as $v) 
{ 
    $item['title'] = $v['title']; 
    $item['price'] = $v['price']; 
    $item['desc'] = $v['desc']; 
    $item['model'] = $v['model']; 
    $item['manufacturer'] = $v['manufacturer']; 
    $item['image'] = $v['image']; 
    $item['cat'] = $v['cat']; 
    $item['subcat'] = $v['subcat']; 
} 

    //see if parent cat exists 
    $sql = 'SELECT cat_id FROM ' . SHOP_CAT_TABLE . ' WHERE cat_name = "'.$db->sql_escape($item['cat']).'"'; 
    $result = $db->sql_query($sql); 
    $parent = $db->sql_fetchrow($result); 

    // if not exists 
    if($parent['cat_id'] == '') 
    { 
    //add the parent cat to the db 
    $sql_ary = array(
    'cat_name' => $item['cat'], 
    'cat_parent' => 0 
    ); 
    $sql = 'INSERT INTO '.SHOP_CAT_TABLE.' '.$db->sql_build_array('INSERT', $sql_ary); 
    $db->sql_query($sql); 
    $cat_id = $db->sql_nextid(); 

    //see if subcat exists 
    $sql = 'SELECT cat_id FROM ' . SHOP_CAT_TABLE . ' WHERE cat_name = "'.$db->sql_escape($item['subcat']).'"'; 
    $result = $db->sql_query($sql); 
    $row = $db->sql_fetchrow($result); 
    // if not exists 
    if($row['cat_id'] == '') 
    { 
    //add subcat to db 
    $sql_ary = array(
    'cat_name' => $db->sql_escape($item['subcat']), 
    'cat_parent' => $cat_id 
    ); 
    $sql = 'INSERT INTO '.SHOP_CAT_TABLE.' '.$db->sql_build_array('INSERT', $sql_ary); 
    $db->sql_query($sql); 
    $item_cat = $db->sql_nextid(); 
    } 
    else //if exists 
    { 
    $item_cat = $row['cat_id']; 
    } 
    } 
    else //if parent cat exists 
    { 
    //see if subcat exists 
    $sql = 'SELECT cat_id FROM ' . SHOP_CAT_TABLE . ' WHERE cat_name = "'.$db->sql_escape($item['subcat']).'"'; 
    $result = $db->sql_query($sql); 
    $row = $db->sql_fetchrow($result); 
    // if not exists 
    if($row['cat_id'] == '') 
    { 
    //add the subcat to the db 
    $sql_ary = array(
    'cat_name' => $db->sql_escape($item['subcat']), 
    'cat_parent' => $parent['cat_id'] 
    ); 
    $sql = 'INSERT INTO '.SHOP_CAT_TABLE.' '.$db->sql_build_array('INSERT', $sql_ary); 
    $db->sql_query($sql); 
    $item_cat = $db->sql_nextid(); 
    } 
    else //if exists 
    { 
    $item_cat = $row['cat_id']; 
    } 
    } 

    $sql_ary = array(
    'item_title'  => $db->sql_escape($item['title']), 
    'item_price'  => $db->sql_escape($item['price']), 
    'item_desc'  => $db->sql_escape($item['desc']), 
    'item_model' => $db->sql_escape($item['model']), 
    'item_manufacturer' => $db->sql_escape($item['manufacturer']), 
    'item_image' => $db->sql_escape($item['image']), 
    'item_cat' => $db->sql_escape($item_cat) 
); 

    $sql = 'INSERT INTO ' . SHOP_ITEM_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); 

    $db->sql_query($sql); 
$i++; 
} 

?> 

Gibt es Vorschläge, wie Sie diese Hinweise/Fehler beheben und das Skript dazu bringen, die Seiten korrekt zu durchlaufen? Ich bin fast sicher, dass es etwas ist sehr einfach, dass ich mit Blick auf ...

Antwort

0

Es hört nicht auf, es stirbt wegen der schwerwiegenden Fehler auf der Leitung 42.

Warnungen aus diesen Linien kommen:

35: $item['title'] = trim($html->find('#productName', 0)->plaintext); 
36: $item['price'] = trim($html->find('#productPrices', 0)->plaintext); 
37: $item['cat'] = $html->find('#navBreadCrumb', 0)->plaintext; 
38: list($home, $item['cat'], $item['subcat'], $title) = explode("::", $item['cat']); 
39: $item['cat'] = str_replace("&nbsp;", "", $item['cat']); 
40: $item['subcat'] = str_replace("\n", "", str_replace("&nbsp;", "", $item['subcat'])); 
41: $item['desc'] = trim($html->find('#productDescription', 0)->plaintext); 
42: $item['model'] = $html->find('ul#productDetailsList', 0)->find('li', 0)->plaintext; 

Ihr Skript von Seite zu Seite gehen nicht, sie alle products_ids 1-99999 durchläuft, und anscheinend gibt es kein Produkt mit id 2, so dass diese URL gibt etwas unerwartetes:

index.php?main_page=product_info&products_id='.$i.'&zenid=e4b7dde8de02e1df005d4549e2e3e529` 

Da Sie erwarten, dass diese Seite hat ul#productDetailsList (und es nicht) und ->find() auf es nennen - Skript stirbt, weil man auf einem wäre null

Lösung ein Verfahren rufen zu überprüfen, ob die Seite zum ersten Mal bestimmte Selektoren hat und versuchen title, price, cat und so weiter nur zu extrahieren, wenn sie

0

Warum Sie nicht nur überprüfen vorhanden sind, wenn die Objekte, die Sie mit ihnen nicht null sind, bevor Sie versuchen abrufen?

0

Ihre Fehler zeigen an, dass Sie nicht die richtige HTML-Quelle suchen.

Konnte die Eigenschaft plaintext nicht finden, weil #productName nicht gefunden wurde.

Konnte die Eigenschaft plaintext nicht finden, da #productPrices nicht gefunden wurde.

Line 36: $item['price'] = trim($html->find('#productPrices', 0)->plaintext); 

Explodieren auf '::' produzieren nicht ein drittes Element

Line 38: list($home, $item['cat'], $item['subcat'], $title) = explode("::", $item['cat']); 

Fatal, rufen Sie konnte nicht() auf das Ergebnis finden, weil ‚ul # productDetailsList nicht gefunden wurde.

Line 42: $item['model'] = $html->find('ul#productDetailsList', 0)->find('li', 0)->plaintext; 

ich zwei Dinge zu Ihrem Skript hinzufügen würde, 1) Debug-Dumps die rohen html Sie versuchen, zu analysieren, zu protokollieren, und 2) überprüft, ob die Funde erfolgreich sind zu sehen.

1) um die Linie 32:

// put the $url into a variable 
$url = 'XXXXXXXXX.com/index.php?blahblah'; 
echo "$url<br>\n"; // echo it so you can see the progress 
$html = file_get_html($url); 

// log for debugging if problems: 
$log_file = tempnam('/tmp/', 'rip_log_'); 
file_put_contents($log_file, $url . "\n" . $html) 

2) einen Scheck für jeden erfolgreichen Fund hinzufügen. (Beispiel):

$test = $html->find('#productName', 0); 
if ($test) { 
    $item['title'] = trim($test->plaintext); 
} else { 
    echo "Could not find #productName"; 
    // maybe call break? 
    break; 
} 
Verwandte Themen