【问题标题】:Scrapy crawl category links till product pageScrapy 抓取类别链接直到产品页面
【发布时间】:2015-12-31 20:43:17
【问题描述】:

您好,我正在尝试抓取一个使用滚动加载数据并加载更多按钮的电子商务网站想要一些帮助让我开始我对网络抓取很陌生。

编辑问题 好的,我正在抓取这个网站 [link]http://www.jabong.com/women/,它有子类别,我正在尝试抓取我在上面代码中尝试过的所有子类别产品,但没有奏效,所以在做了一些研究之后,我创建了一个有效但不满足我的目标的代码.到目前为止我已经尝试过这个

` import scrapy
#from scrapy.exceptions import CloseSpider

from scrapy.spiders import Spider
#from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request
from koovs.items import product
#from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector    

class propubSpider(scrapy.Spider):
name = 'koovs'
allowed_domains = ['jabong.com']
max_pages = 40

def start_requests(self):
    for i in range(self.max_pages):
         yield scrapy.Request('http://www.jabong.com/women/clothing/tops-tees-shirts/tops/?page=%d' % i, callback=self.parse)

def parse(self, response):
    for sel in response.xpath('//*[@id="catalog-product"]/section[2]'):
        item = product()
        item['price'] = sel.xpath('//*[@class="price"]/span[2]/text()').extract()
        item['image'] = sel.xpath('//*[@class="primary-image thumb loaded"]/img').extract()
        item['title'] = sel.xpath('//*[@data-original-href]/@href').extract()
     `

上面的代码适用于一个类别,如果我指定页数,上面的网站有很多给定类别的产品,我不知道它们驻留在多少页,所以我决定使用爬虫来浏览所有类别和产品页面并获取数据,但我对scrapy非常陌生,任何帮助将不胜感激

【问题讨论】:

  • @Alecxe 你能帮我按照你的代码,但它不工作
  • 如果您发布您想要抓取的网站以及您尝试过的代码,那么获得帮助会容易得多。
  • @stummjr 我已经添加了我尝试过的代码,并且还按照建议提到了该网站。
  • 你能解决问题还是需要帮助?
  • @Rahul 是的,我仍然需要帮助,我正在耐心等待有人回答

标签: python-2.7 web-scraping scrapy


【解决方案1】:

您需要了解的第一件事是网站的 DOM 结构经常变化。所以过去写的刮板现在可能对你有用,也可能对你不起作用。

所以抓取网站最好的方法是找到一个隐藏的api或隐藏的url,只有在你分析网站的网络流量时才能看到。这不仅为您提供了可靠的抓取解决方案,而且还节省了带宽,这在进行广泛抓取时非常重要,因为大多数时候您不需要下载整个页面。

让我们以您正在抓取的网站为例,以获得更清晰的信息。当您访问此page 时,您会看到显示Show More Product 的按钮。转到浏览器的开发人员工具并选择网络分析器。当您单击该按钮时,您将看到浏览器向此link 发送 GET 请求。检查响应,您将在第一页看到所有产品的列表。现在当你分析这个链接时,你可以看到它有一个参数page=1。将其更改为page=2,您将在第二页看到所有产品的列表。

现在继续写蜘蛛。它会是这样的:

import scrapy
from scrapy.exceptions import CloseSpider
from scrapy.spider import BaseSpider
from scrapy.http import Request
from jabong.items import product

class aqaqspider(BaseSpider):
    name = "jabong"
    allowed_domains = ["jabong.com"]
    start_urls = [
    "http://www.jabong.com/women/clothing/tops-tees-shirts/tops/?page=1&limit=52&sortField=popularity&sortBy=desc",
]
    page = 1

    def parse(self, response):
        products = response.xpath('//*[@id="catalog-product"]/section[2]/div')
        if not products:
            raise CloseSpider("No more products!")

        for p in products:
            item = product()
            item['price'] = p.xpath('a/div/div[2]/span[@class="standard-price"]/text()').extract()
            item['title'] = p.xpath('a/div/div[1]/text()').extract()
            if item['title']:
                yield item

        self.page += 1
        yield Request(url="http://www.jabong.com/women/clothing/tops-tees-shirts/tops/?page=%d&limit=52&sortField=popularity&sortBy=desc" % self.page,
                  callback=self.parse, 
                  dont_filter=True)  

注意-此示例仅用于教育目的。在从网站上抓取/抓取/存储任何数据之前,请参考网站的Terms and Conditions/Privacy Policy/Robots.txt。

【讨论】:

  • 这正是我所做的,因为您可以看到已编辑的问题我已经添加了我尝试过的代码,但问题是它仅适用于我希望蜘蛛从所有类别中获取产品的类别。我使用相同的请求方法进行分页并提到最多 40 个页面只爬取 40 个页面,而对于某些类别的页面超过 40 个,我可以创建一个爬虫蜘蛛,我可以在规则中提及这些 xhr 请求并爬取每个类别
  • 另外我想指出该项目需要从产品详细信息页面中提取信息,格式为m.jabong.com/vero-moda-White-Sequins-Blouse-1763164.html?pos=2,那么我如何从上述代码进入这些链接并提取信息?
  • 是的,您可以创建规则来抓取这些页面。您还可以使用 alexce 的示例来爬取所有页面。将页码更改为 page=500,您将看到 id id="catalog-product" 的部分在 DOM 中不存在。那时您将知道没有更多可用的产品。然后引发 Closespider 方法。检查修改后的代码。
  • 如果你想爬取所有子类别然后获取子类别的所有url,然后将它们全部填充到start_urls。这样您也可以从子类别中获取所有数据。您可以使用链接提取器或回调一个为您提供所有类别链接的函数。
  • 还有不同的方法可以解决您进入链接的问题。其中之一是爬取子类别的所有 url 并将其存储在列表中。遍历该列表,然后回调一个不同的方法,该方法将从您提到的所有这些链接中抓取数据。
猜你喜欢
  • 2018-12-16
  • 2016-12-24
  • 2019-02-17
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多