0

私はウェブショップを所有しており、サプライヤの1つが親切にも製品モデル番号、価格、タイトルを含むCSVファイルを提供してくれますが、製品の説明を含むデータベースダンプを提供することはできません。私は製品の説明を削ることを許可されていますが、問題はどのようにですか?

All URLs include the model number like "title-of-product-MN-504-1.htm"
The descriptions are inside a <div> tag like "<div id="description"> Bla bla bla <other tag>bla bla </other tag> bla bla </div>"

csvファイルまたはMySQLテーブルにすべてのモデル番号があるとしましょう-モデル番号に関連付けられた説明をURLに保存するにはどうすればよいですか(簡単な場合は別のdivタグ内にあります)?

要約すると、入力はcsvまたはMySQLテーブルからのモデル番号であり、出力はモデル番号と個々のページのdivタグからの説明を含むMySQLテーブル(またはcsv)である必要があります。次のツールを検討していますが、それらを接続して目的の機能を実行する方法がわかりません:wget、cURL、およびPHP Simple HTML DOM Parser

4

3 に答える 3

2

このhttp://phpcrawl.cuab.de/を使用して、次の特定のプロパティを使用できます:http: //phpcrawl.cuab.de//classreferences/index.html次に、説明を検索します:phpのhtmlタグ間の文字列を抽出します

クロールされたページで見つかったURLでモデル番号を見つけるための要件については、次のプロパティを使用できます:http: //phpcrawl.cuab.de/classreferences/index.html

彼らから取得したCSVファイルにインデックスを付け、サイトにインデックスを付ける場合。私は次のことをします

説明を取得するために必要なすべてのモデル番号のリストを作成します。

  1. フロントページをクロールしてプロセスを開始します。URLを収集し、訪問者リストに追加します
  2. モデル番号に一致するリスト内のすべてのURLにアクセスし、説明を取得して、リストからモデルを削除します。URLを収集し、訪問者リストに追加します
  3. 手順2に戻る-リストにモデルがなくなるまで繰り返します

モデル番号が含まれるURLを取得する方法については、 http://php.net/manual/en/function.strpos.phpを参照してください。

このようなもの、私はあなたに実装を任せます:

foreach($list_of_urls as $url) {
    foreach($list_of_modelnumbers as $model) {
        if(strpos($url, $model)) {
            $list_of_urls_to_crawl[] = $url; 
   /* you can also remove the $model, but I already wrote it in a foreach loop */
            break;
        }
    }
}

次に、クローラーの結果から新しいものをクリアし$list_of_urlsて追加できます:)

foreach($list_of_urls_to_crawl as $url) {
     //Set $crawler, let him go, get your description etc.

     foreach($crawler->links_found as $url) {
         $list_of_urls[] = $url;
     }
}

そして、それを壮大なwhile($still_need_descriptions)ループに配置します。

于 2013-03-04T13:41:06.293 に答える
1

または、 http://phpcrawl.cuab.de/が気に入らない場合は、 PHP-Spiderを使用できます。

CSVに基づいてカスタムURLディスカバリーを作成し、クロールされたページをXPathクエリで解析するのと同じくらい簡単です。https://mvdbos.github.io/php-spider/の例を参照してください。変更する必要があるのは、Spiderに追加されるDiscovererクラスだけです。URLがどのように構築されているかを知っているとすると、次のようになります。

class CsvModelNumberDiscoverer implements Discoverer
{
    protected $modelNumbersAndTitles = array();

    public function __construct(array $modelNumbersAndTitles)
    {
        $this->modelNumbersAndTitles = $modelNumbersAndTitles;
    }

    public function discover(Spider $spider, Resource $document)
    {
        $urls = array();
        foreach ($this->modelNumbersAndTitles as $number => $title) {
            $urls[] = 'http://example.com/' . $title . '-MN-' . $number . '.htm';
        }
        return $urls;
    }
}

スパイダーを実行するコードは次のようになります。

$spider = new Spider('http://www.example.com');
$spider->addDiscoverer(new CsvModelNumberDiscoverer($modelNumbersAndTitles);
$result = $spider->crawl();

最後に、次のような結果から説明を取得できます。

foreach ($result['queued'] as $resource) {
    $modelNo = $resource->getCrawler()->filterXpath("div[@id='modelNo']")->text();
    $description = $resource->getCrawler()->filterXpath("div[@id='description']")->text();
}

URLがどのように構築されているかわからない場合は、サイト全体をスパイダーし(AmazingDreamsの回答のように)、ディスカバリーを使用してURLをモデル番号のリストと照合します。ただし、もっと時間がかかります。

完全開示:PHP-Spiderを作成しました。

于 2013-03-05T14:33:51.343 に答える
0

最初に使用してhtmlコードを取得できます

$homepage = file_get_contents('http://www.example.com/title-of-product-MN-504-1.htm');

次に、php domパーサーでhtmlコードを使用して、必要な正確な要素の値を取得します。

于 2013-03-04T11:53:33.297 に答える