質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1041閲覧

PHPでHTMLをスクレイピングし、差分を抽出・出力したい

bibouroku

総合スコア8

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/05/26 05:17

編集2020/05/26 05:20

前提・実現したいこと

1.本番環境と検証環境の商品ページのA要素をそれぞれスクレイピング(DOM生成し、Xpathで取得)
2.取得したA要素を本番環境と検証環境で比較
3.差分がある場合は、差分出力用の変数に格納し、出力する
4.上記を商品ページの数分、処理する。

ブラウザから差分出力のPHPプログラムを実行し、上記の処理をしたいです。

差分出力用の変数のイメージ

$prd_item:本番環境の商品ページのA要素
$stg_item:検証環境の商品ページのA要素

php

1 2foreach ($item_ids as $item_id) { 3/** 4*スクレイピングをし、A要素を取得しているソースは省略 5*/ 6$item_diff = []; //差分出力用の変数 7 8 if ($prd_item != $stg_item){ 9 $cnt = count($item_diff); 10 $item_diff[$cnt]['item_id'] = $item_id; 11 $item_diff[$cnt]['stg_item'] = $stg_item; 12 $item_diff[$cnt]['prd_item'] = $prd_item; 13 } 14} 15var_dump($item_diff); //差分出力用の変数を出力

発生している問題

比較する商品ページの数が多いと、差分を出力するまでにタイムアウトしてしまう。
タイムアウトせずに出力するにはどうすればよいか?
※PHPのメモリ上限を引き上げる、以外でお願いします。

試したこと

10件,20件程度なら差分を出力してくれる。

補足情報(FW/ツールのバージョンなど)

フレームワークなどは使ってません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

例えば1~100まであって一度に全部やるとタイム・アウトしてしまうというのであれば、
タイムアウトしない粒度に処理をわけて、
どこまで処理が完了したかをデータベース上で管理できる前提で、
チェックボックスにチェックを入れるようにデータベースに1番完了、2番完了、などと記録しながら
PHP処理を再読込するようにでもすれば、
いずれ100番まで処理は進められるかと。

webブラウザで処理を管理するのであれば、
単発のスクレイピング処理をAjaxで叩いて順次実行させるとかいう方法も。

正解は一つじゃないので、わかるところから手を付けて試していただければ。

投稿2020/05/26 05:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bibouroku

2020/05/26 05:41

回答ありがとうございます! > webブラウザで処理を管理するのであれば、 > 単発のスクレイピング処理をAjaxで叩いて順次実行させるとかいう方法も。 こちらもう少しイメージをクリアにしたいです。 1.Ajaxで単発のスクレイピング処理をする   この際、スクレイピング処理のPHPプログラムに、商品IDをパラメータにして渡す 2.処理が成功したら、商品IDをプラス1し、スクレイピング処理のPHPに渡す 3.上記を商品IDの数文繰り返す 上記のイメージでいいでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/26 06:01 編集

スクレイピングを単発完結にしちゃって、 jsonの応答かなにかで成功ステータスが返ってきたら次のidについてスクレイピング処理を呼ぶ、 みたいなのの繰り返しのほうが、 phpの処理可能な時間の制約も突破できるのではないかと。
bibouroku

2020/05/26 06:11

> スクレイピングを単発完結にしちゃって、 > jsonの応答かなにかで成功ステータスが返ってきたら次のidについてスクレイピング処理を呼ぶ、 ・単一のIDをスクレイピングするPHPファイルを作成 ・成功ステータスが返却されたら次のIDを上記のPHPファイルに渡すajaxを作成 上記で合ってるでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/26 06:17

そうですね、その方がシンプルに単体テストができますし。 組み方によっては、スクレイピングするphp処理を複数同時に叩くことも可能ですし。 (jQueryでAjaxの使い方次第ですが、先方のサーバーに付加をかけてBANされない程度にほどほどに。)
bibouroku

2020/05/26 06:23

理解できました! ありがとうございました。 あとは自力でやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問