0

curl、dom、xpath を使用して単一の Curl セッションの構築を開始しましたが、うまく機能しました。

現在、1 つのフローで複数のサイトからデータを取得するための curl に基づくスクレーパーを構築しています。スクリプトは、入力した単一のフレーズをエコーし​​ていますが、変数を取得しません。

do{
    $n=curl_multi_exec($mh, $active);
}while ($active);

foreach ($urls as $i => $url){  
    $res[$i]=curl_multi_getcontent($conn[$i]);      
    echo ('<br />success');
}

したがって、これはURLの数だけ成功テキストをエコーし​​ます..しかし、実際にはこれは私が望むものではありません..単一のcurlセッションでできるようにhtmlを分割したい..

単一のcurlセッションで行ったこと:

//parse the html into a DOMDocument
$dom = new DOMDocument();
@$dom->loadHTML($res);

// grab all the on the page
$xpath = new DOMXPath($dom);         
$product_img = $xpath->query("//div[@id='MAIN']//a");

for ($i = 0; i < $product_img->length; $i++){
    $href = $product_img->item($i);
    $url = $href->getAttribute('href');
    echo "<br />Link : $url";
}

この dom 解析 / xpath は、単一セッションのカールでは機能しますが、マルチカールを実行すると機能しません。Multicurl では、セッションから URL に対して curl_multi_getcontent を実行できますが、これは望ましくありません。単一のセッションで Dom / Xpath で取得したものと同じコンテンツを取得したいと考えています。私に何ができる ?

編集

getAttribute に問題があるようです。つかむのに苦労している画像へのリンクです。スクレイピング時にリンクが表示されますが、エラーがスローされます:

致命的なエラー: の非オブジェクトに対するメンバー関数 getAttribute() の呼び出し

クエリ:

// grab all the on the page
$xpath = new DOMXPath($dom);
$product_img = $xpath->query("//img[@class='product']");
$product_name = $xpath->query("//img[@class='product']");

これは機能しています:

for ($i = 0; i < $product_name->length; $i++) {
    $prod_name = $product_name->item($i);
    $name = $prod_name->getAttribute('alt');
    echo "<br />Link stored:  $name";
}

これは機能していません:

for ($i = 0; i < $product_img->length; $i++) {
    $href = $product_img->item($i);
    $pic_link = $href->getAttribute('src');
    echo "<br />Link stored:  $pic_link";
}

私が間違っていることのアイデアはありますか? 前もって感謝します。

4

1 に答える 1

0

何らかの奇妙な理由で、src正しく機能しないのはその 1 つだけです。
この質問は「解決済み」と見なすことができます。

于 2012-09-15T15:08:16.303 に答える