0

更新: ソース コードは、開発者ツールが示すものとは大きく異なります。

ソースを確認してください: view-source:http://www.machinerytrader.com/list/list.aspx?ETID=1&catid=1002

ブラウザで html にレンダリングする必要があるのは JavaScript ですか? もしそうなら、Htmlを解析できるようにphpにそのプロセスを実行させるにはどうすればよいですか? Xpath Checker を使用して探しているアイテムを返すことができるのは奇妙ですが (以下を参照)、完全な html にアクセスすることはできません!

(Xpath: //table[contains(@id, 'ctl00_ContentPlaceHolder1') and (contains(@id,"tblContent") or contains(@id,"tblListingHeader"))]))

更新を終了

定期的に仕事をするために、このサイトからいくつかの情報をかき集める必要があります。このデータをスクレイピングするための PHP コードを作成しようとしています。SOに関する他の多くの投稿を読んだので、ここにいくつかの名前空間の問題があると思います。以前に名前空間の問題に遭遇したことはなく、別の SO 投稿に示されているアプローチを使用しました (役に立たなかった:()。

なんらかの理由で xpath クエリが発生していないようです。この問題を処理する方法について推測や解決策がある場合は、提案を受け付けています。

また、ここに私のコードからの出力があります:

object(DOMXPath)#2 (0) {
}
Debug 1
array(0) {
}
array(0) {
}

testarray を var_dump し、otherarray を作成して var_dump するコードの下部を省略しました。それらの出力は上記に含まれています。DOMXPath 要素の長さが 0 の場合も、明らかに 2 つの配列は空になります。

$string = 'http://www.machinerytrader.com/list/list.aspx?ETID=1&catid=1002';

$machine_trader = file_get_contents($string);
$xml = new DOMDocument();
$xml->loadHTML($machine_trader);

$xpath = new DOMXPath($xml);

$rootNamespace = $xml->lookupNamespaceUri($xml->namespaceURI); 
$xpath->registerNamespace('x', $rootNamespace); 

$tableRows = $xpath->query("//x:table[contains(@id, 'ctl00_ContentPlaceHolder1') and (contains(@id,'tblContent') or contains(@id,'tblListingHeader'))]");

var_dump($xpath);

$testarray = array();
$otherarray = array();

foreach ( $tableRows as $row )
{

        echo "Debug 1"."\n";

        $testarray[] = $row->nodeValue;

}
4

1 に答える 1

1

実際のコンテンツがまだ到達していないフォーム投稿から検出される限り、これはXPathの問題ではありません。ここでのJSソースコードは、情報リクエストの適切な「ユーザー」を認証し、フォーム送信を介してリクエストを送信するだけです。

リクエストごとに、ソルト/暗号化の「キー」がランダム化されて変更され、単純なスクレイプが防止されます。

そのJavaScriptをPHPに書き直してから、2つのリクエストを発行し、途中で認証プロセスと戦うことができます。

または、これをリバースエンジニアリングするのではなく、スクレイピングをNodeJSに切り替えて、JavaScriptを評価できるが、プログラムでアクセスできるPhantomJSのようなものを使用することもできます。このタスクの複雑さを考えると、適切なツールを使用する方がはるかに簡単です。

于 2012-10-09T16:34:47.577 に答える