每页无法抓取多件商品

时间:2016-11-01 01:46:09

标签: python scrapy

我是scrapy的新手并试图从几个网站爬行,但是从那里获得的图片不多。

例如,对于具有以下代码的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个产品。我期待66.

对于包含以下代码的网址https://www.renttherunway.com/products/dress -

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

我得到了12.我期待大约100个。

即使我将其更改为抓取每个' next'页面,我每页得到相同的数字,但它成功地遍历了所有页面。

我尝试过另外一个USER_AGENT,禁用COOKIES和DOWNLOAD_DELAY为5。

我想我会在任何网站上遇到同样的问题,所以人们之前应该已经看过这个但是找不到它的引用。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

这是一个奇怪的网站,他们将产品数据存储为html源代码中的json,然后在页面加载时使用javascript解压缩。

为了解决这个问题,通常你想做的是

  • 停用javascript并执行scrapy view <url>
  • 调查结果
  • 在产品网址中找到该ID并在页面源中搜索该ID以检查其是否存在,如果存在,则将其隐藏。如果它不存在则意味着它被某些AJAX请求填充 - &gt;重新启用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}