1

ショッピングサイトExpress.comからいくつかのデータを取得しようとしています。これは、画像価格タイトルを含む多くの製品の1つです。

  <div class="cat-thu-product cat-thu-product-all item-1">
<div class="cat-thu-p-cont reg-thumb" id="p-50715" style="position: relative;"><a href="/rocco-slim-fit-skinny-leg-corduroy-jean-50715-647/control/show/3/index.pro" onclick="var x=&quot;.tl(&quot;;s_objectID=&quot;http://www.express.com/rocco-slim-fit-skinny-leg-corduroy-jean-50715-647/control/show/3/index.pro_1&quot;;return this.s_oc?this.s_oc(e):true"><img class="cat-thu-p-ima widget-app-quickview" src="http://t.express.com/com/scene7/s7d5/=/is/image/expressfashion/25_323_2516_900/i81?$dcat191$" alt="ROCCO SLIM FIT SKINNY LEG CORDUROY JEAN"></a><a href="#jsLink"><img id="widget-quickview-but" class="widget-ie6png glo-but-css-off2" src="/assets/images/but/cat/but-cat-quickview.png" alt="Express View" style="position: absolute; left: 50px;"></a></div>
  <ul>
    <li class="cat-cat-more-colors">
      <div class="productId-50715">
        <img class="js-swatchLinkQuickview" title="INK BLUE" src="http://t.express.com/com/scene7/s7d5/=/is/image/expressfashion/25_323_2516_900_s/i81?$swatch$" width="16" height="6" alt="INK BLUE">
        <img class="js-swatchLinkQuickview" title="GRAPHITE" src="http://t.express.com/com/scene7/s7d5/=/is/image/expressfashion/25_323_2516_924_s/i81?$swatch$" width="16" height="6" alt="GRAPHITE">
        <img class="js-swatchLinkQuickview" title="MERCURY GRAY" src="http://t.express.com/com/scene7/s7d5/=/is/image/expressfashion/25_323_2516_930_s/i81?$swatch$" width="16" height="6" alt="MERCURY GRAY">
        <img class="js-swatchLinkQuickview" title="HARVARD RED" src="http://t.express.com/com/scene7/s7d5/=/is/image/expressfashion/25_323_2516_853_s/i81?$swatch$" width="16" height="6" alt="HARVARD RED">
      </div>
    </li>
    <li class="cat-thu-name"><a href="/rocco-slim-fit-skinny-leg-corduroy-jean-50715-647/control/show/3/index.pro" onclick="var x=&quot;.tl(&quot;;s_objectID=&quot;http://www.express.com/rocco-slim-fit-skinny-leg-corduroy-jean-50715-647/control/show/3/index.pro_2&quot;;return this.s_oc?this.s_oc(e):true">ROCCO SLIM FIT SKINNY LEG CORDUROY JEAN
    </a></li>
    <li>
      <strong>$88.00</strong>
    </li>
  <li class="cat-thu-promo-text"><font color="BLACK" style="font-weight:normal">Buy 1, Get 1 50% Off</font>
  </li>
</ul>

私が行った非常に素朴でエラーが発生しやすいアプローチは、最初にすべての価格、画像、タイトル、色を取得することです。

var price_objects = $('.cat-thu-product li strong');
var image_objects = $('.cat-thu-p-ima');
var name_objects = $('.cat-thu-name a');
var color_objects = $('.cat-cat-more-colors div');

次に、 node.jsのjsdomまたはcheerioスクレイピングライブラリを使用して抽出されたDOMからのデータを配列に入力します。(この場合はCheerio)。

  // price info
  for (var i = 0; i < price_objects.length; i++) {
    prices.push(price_objects[i].children[0].data);
  }
  // image links
  for (var i = 0; i < image_objects.length; i++) {
    images.push(image_objects[i].attribs.src.slice(0, -10));
  }
  // name info
  for (var i = 0; i < name_objects.length; i++) {
    names.push(name_objects[i].children[0].data);
  }
  // color info
  for (var i = 0; i < color_objects.length; i++) {
    colors.push(color_objects[i].attribs.src);
  }

最後に、価格、タイトル、画像、色が一致するという仮定に基づいて、製品オブジェクトを作成します。

for (var i = 0; i < images.length; i++) {
  items.push({
    id: i,
    name: names[i],
    price: prices[i],
    image: images[i],
    colors: colors[i]
  });
}

この方法は時間がかかり、エラーが発生しやすく、非常にアンチドライです。$('.cat-thu-product')一度に1つのforループを使用して、1つの製品から関連情報を抽出できればいいのにと思いました。

しかし、jsdomまたはcheerioでDOMをトラバースしようとしたことがありますか?誰もがそれをどのように理解できるのかわかりません。誰かが、$('.cat-thu-product')すべての関連情報を含むdiv要素を取得し、必要なデータを抽出することによって、この提案されたスクレイピング方法をどのように使用するかを示すことができますか?

または、おそらくこれを行うためのより良い方法がありますか?

4

3 に答える 3

2

node.io を試すhttps://github.com/chriso/node.io/wiki

これは、やろうとしていることを実行するための良いアプローチになります。

于 2013-01-31T12:50:23.917 に答える
2

jQuery を引き続き使用することをお勧めします (簡単、高速、安全であるため)。1 つの .each の例:

var items = [];
$('div.cat-thu-product').each(function(index, productElement) {
  var product = {
    id: $('div.cat-thu-p-cont', productElement).attr('id'),
    name: $('li.cat-thu-name a', productElement).text().trim(),
    price: $('ul li strong', productElement).text(),
    image: $('.cat-thu-p-ima', productElement).attr('src'),
    colors: []
  };
  // Adding colors array
  $('.cat-cat-more-colors div img', productElement).each(function(index, colorElement) {
    product.colors.push({name: $(colorElement).attr('alt'), imageUrl: $(colorElement).attr('src')});
  });

  items.push(product);
});

console.log(items);

また、必要なフィールドがすべて揃っていることを検証するために、バリデーターまたはテストを簡単に作成できます。ただし、別のライブラリを使用している場合でも、「div.cat-thu-product」要素をループする必要があります。

于 2013-01-31T12:43:38.237 に答える
0

https://github.com/rc0x03/node-promise-parserを使用

products = []; 
pp('website.com/products')
 .find('div.cat-thu-product')
 .set({
     'id':       'div.cat-thu-p-cont @id',
     'name':     'li.cat-thu-name a',
     'price':    'ul li strong',
     'image':    '.cat-thu-p-ima',
     'colors[]': '.cat-cat-more-colors div img @alt',
 })
 .get(function(product) {
    console.log(product);
    products.push(product);
 })
于 2014-06-09T18:44:28.993 に答える