2016-11-01 7 views
1

私は治療に慣れていて、いくつかのサイトからクロールしようとしましたが、そこからいくつかの画像を取得することはできませんでした。例えばページあたりのアイテム数を超えてクロールすることはできません

、次のコードでhttp://shop.nordstrom.com/c/womens-dresses-newのために -

def parse(self, response): 
    for dress in response.css('article.npr-product-module'): 
     yield { 
      'src': dress.css('img.product-photo').xpath('@src').extract_first(), 
      'url': dress.css('a.product-photo-href').xpath('@href').extract_first() 
     } 

私は6つの製品を得ました。私は、

def parse(self, response): 
    for dress in response.css('div.cycle-image-0'): 
     yield { 
      'image-url': dress.xpath('.//img/@src').extract_first(), 
     } 

私は12で私はすべての「次」のページをクロールするためにそれを変更してもおよそ100

を期待していました - 私は、次のコードでURL https://www.renttherunway.com/products/dressについて66

を期待しますページごとに同じ番号が付いていますが、すべてのページを正常に通過しました。

私は人々が前にこれを見ている必要がありますので、私はすべてのサイトで同じ問題に遭遇するだろうと想像が、への参照を見つけることができない別のUSER_AGENT、無効クッキー、5

のDOWNLOAD_DELAYを試してみましたそれ。

私には何が欠けていますか?

答えて

2

これは、htmlソースのjsonとして製品データを格納し、後で読み込むページのjavascriptで展開する奇妙なWebサイトの1つです。結果

  • は、製品のURLにIDを見つけるとするページのソースにそのIDを検索する調査何がやりたいことは

    • JavaScriptを無効にされ、通常はこれを理解し、scrapy view <url>
    • を行うには

      存在するかどうか、存在する場合は隠れているかどうかを確認してください。存在しない場合は、AJAXの一部のリクエスト - > reenable javascriptによって読み込まれていることを意味します。ページに移動し、ブラウザインスペクタのネットワークタブを調べて見つけます。

    あなたは正規表現ベースの検索を行う場合:

    re.findall("ProductResults, (\{.+\})\)", response.body_as_unicode()) 
    

    あなたはすべての製品とその情報が含まれている巨大なJSONを取得します。

    import json 
    import re 
    data = re.findall("ProductResults, (\{.+\})\)", response.body_as_unicode()) 
    data = json.loads(data[0])['data'] 
    print(len(data['ProductResult']['Products'])) 
    >> 66 
    

    これは正しい量の製品を取得します。
    あなたの解析では、これを行うことができます:

    def parse(self, response): 
        for product in data['ProductResult']['Products']: 
         # find main image 
         image_url = [m['Url'] for m in product['Media'] if m['Type'] == 'MainImage'] 
         yield {'image_url': image_url} 
    
  • 関連する問題