ご挨拶。卸売業者のWebサイトで製品情報を取得し、その情報をデータベースに入力することになっているphpスクリプトがあります。
サンプル製品のすべての情報を正常に収集しました。すべての$v変数の単純なエコーを実行すると、すべてが正しく画面に出力されます。
ここで、製品のカテゴリがデータベースに存在するかどうかを確認するためのチェックを追加し、実際に情報を挿入すると、次のようになります。
[phpBBデバッグ]PHP通知:35行目のファイル/rip.php内:非オブジェクトのプロパティを取得しようとしています[phpBBデバッグ] PHP通知:36行目のファイル/rip.php内:非オブジェクトのプロパティを取得しようとしています[phpBB Debug] PHP通知:ファイル/rip.phpの38行目:未定義のオフセット:3 [phpBB Debug] PHP通知:ファイル/rip.phpの38行目:未定義のオフセット:2 [phpBB Debug] PHP通知:in 41行目のファイル/rip.php:非オブジェクトのプロパティを取得しようとしています致命的なエラー:42行目の/XXXXX/public_html/XXXXX/rip.phpの非オブジェクトでメンバー関数find()を呼び出します
ただし、製品のすべての情報は引き続きデータベースに入力されます。
スクリプトはページごとに移動して情報を収集することになっていますが、最初の製品の後で停止します。
私はSCChenのSimpleHTMLDOMスクレーパースクリプト(http://sourceforge.net/projects/simplehtmldom/)と、データベース呼び出し用のphpBBのコアシステムを使用しています。これが私のPHPソースです。
<?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(" ", "", $item['cat']);
$item['subcat'] = str_replace("\n", "", str_replace(" ", "", $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++;
}
?>
これらの通知/エラーをクリアし、スクリプトでページを正しく反復する方法についての提案はありますか?私が見落としているのは非常に単純なことだと私はほぼ確信しています...