Scrapy脚本无法在电子商务网站页面上获得所有产品

时间:2018-07-11 14:06:38

标签: python-3.x scrapy

我还是新手,我正在尝试抓取产品列表页面(来自:nordstromrack.com)。我在其他网站上使用了几乎相同的脚本,没有任何问题,但是在该网站上,似乎只有我想要抓取的页面的前6个项目。我在同一网站上使用了不同的页面,但结果相同(例如:https://www.nordstromrack.com/shop/Women/Clothing/Activewear)。我使用scrapy shell来查看是否获得了不同的结果,但仅获得了前6个链接。页面源也仅显示6个链接。因此,我对问题所在感到困惑。我到处都进行了研究,很显然这可能是该站点使用脚本一次加载6种产品的问题。但是,我发现的大多数答案都是说要查找下一页并刮下一页(但这仅适用于无限滚动的页面)。其他解决方案提到使用Selenium,但我想它将遇到相同的问题,因为我们要关注的链接不在页面源中。有谁知道如何解决这个问题。非常感激。

这是我此页面的脚本:https://www.nordstromrack.com/clearance/Men/Accessories?priceRanges%5B%5D=100-200&sort=most_popular

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy import Spider
from scrapy.loader.processors import MapCompose, Join
from scrapy.loader import ItemLoader
from scrapy.spiders import Spider
from esourcing.items import EsourcingItem
from scrapy.http import Request
import re


class NrtestSpider(CrawlSpider):
    name = 'nrtest'
    allowed_domains = ['nordstromrack.com']
    start_urls = ('https://www.nordstromrack.com/clearance/Men/Accessories? 
   priceRanges%5B%5D=100-200&sort=most_popular',)

    rules = (
        Rule(LinkExtractor(restrict_xpaths='//*[@class="product-grid"]'), 
callback='parse_item'),
    )


    def parse_item(self, response):

        yield {
            'reference': response.css('.product-details__style-number::text') 
[0].extract(),
            'title': response.css('.product-details__title-name::text') 
[0].extract(),
            'brand': response.css('.product-details__title').xpath('.//text()') 
[0].extract(),
            'description': response.css('.product-details-section__definition- 
list').xpath('.//text()').extract(),
            'retail': response.css('.product-details__retail- 
price').xpath('.//text()')[0].extract(),
            'purchase': response.css('.product- 
details__sale').xpath('.//text()')[0].extract(),
            'image_urls': response.css('.image-zoom').xpath('.//img/@src') 
[0].extract(),
            'image_urls_extra': response.css('.product- 
thumbnail').xpath('.//img/@src').extract(),
            'size': response.css('.sku-option__items').xpath('.//*[@class="sku- 
item sku-item--available sku-item--text"]//text()').extract()
        }

1 个答案:

答案 0 :(得分:0)

主要是因为您要查找的数据是使用javascript和AJAX请求呈现的。

如果您在网址的第二页上单击时打开了Web检查器,则可以看到正在发出XHR请求以将所有产品数据都保存在json中(后来的javascript将其解压缩为您在网络上看到的内容)。 / p>

  

https://www.nordstromrack.com/clearance/Men/Accessories?page=2&sort=most_popular

给出此AJAX: https://www.nordstromrack.com/api/search2/catalog/search?context=clearance&department=Accessories&division=Men&includeFlash=false&includePersistent=true&limit=99&page=2&sort=most_popular&experiment=control

所有服装数据都采用json格式: enter image description here

您需要做的只是从上方抓取AJAX网址,而不是最初抓取的网址,然后只需使用json模块加载并将其解析为普通字典即可:

$ scrapy shell "https://www.nordstromrack.com/api/search2/catalog/search?context=clearance&department=Accessories&division=Men&includeFlash=false&includePersistent=true&limit=99&page=2&sort=most_popular&experiment=control"
> import json
> data = json.loads(response.body_as_unicode())
> data['_embedded']  # your products