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";
}
私が間違っていることのアイデアはありますか? 前もって感謝します。