使用 scrapy 从 Flipkart 中抓取数据

Posted

技术标签:

【中文标题】使用 scrapy 从 Flipkart 中抓取数据【英文标题】:Scraping data off flipkart using scrapy 【发布时间】:2015-02-05 07:37:58 【问题描述】:

我正在尝试从 Flipkart.com 上抓取一些信息,为此我正在使用 Scrapy。我需要的信息适用于 Flipkart 上的每个产品。

我为我的蜘蛛使用了以下代码 from scrapy.contrib.spiders import CrawlSpider, Rule

from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.selector import htmlXPathSelector

from tutorial.items import TutorialItem


class WebCrawler(CrawlSpider):
    name = "flipkart"
    allowed_domains = ['flipkart.com']
    start_urls = ['http://www.flipkart.com/store-directory']
    rules = [
        Rule(LinkExtractor(allow=['/(.*?)/p/(.*?)']), 'parse_flipkart', cb_kwargs=None, follow=True),
        Rule(LinkExtractor(allow=['/(.*?)/pr?(.*?)']), follow=True)
    ]

    @staticmethod
    def parse_flipkart(response):
        hxs = HtmlXPathSelector(response)
        item = FlipkartItem()
        item['featureKey'] = hxs.select('//td[@class="specsKey"]/text()').extract()
        yield item

我的意图是爬取每个产品类别页面(由第二条规则指定)并按照类别页面中的产品页面(第一条规则)从产品页面中抓取数据。

    一个问题是我找不到控制抓取和报废的方法。 第二个 Flipkart 在其类别页面上使用 ajax,并在用户滚动到底部时显示更多产品。 我已阅读其他答案并评估硒可能有助于解决问题。但我找不到将其实施到此结构中的适当方法。

欢迎提出建议..:)

其他细节

我之前使用过类似的方法

我使用的第二条规则是

Rule(LinkExtractor(allow=['/(.?)/pr?(.?)']),'parse_category', follow=True)

@staticmethod
def parse_category(response):
    hxs = HtmlXPathSelector(response)
    count = hxs.select('//td[@class="no_of_items"]/text()').extract()
    for page num in range(1,count,15):
        ajax_url = response.url+"&start="+num+"&ajax=true"
        return Request(ajax_url,callback="parse_category")

现在我对回调“parse_category”或“parse_flipkart”使用什么感到困惑

感谢您的耐心等待

【问题讨论】:

【参考方案1】:

    当您说无法找到控制抓取和抓取的方法时,不确定您的意思。为此目的创建蜘蛛已经可以控制它,不是吗?如果您创建正确的规则并正确解析响应,这就是您所需要的。如果您指的是页面被抓取的实际顺序,您很可能不需要这样做。您可以按任意顺序解析所有项目,但通过分析项目标题上方的 breadcrumb 信息来收集它们在类别层次结构中的位置。您可以使用类似这样的方法来获取列表中的面包屑:

    response.css(".clp-breadcrumb").xpath('./ul/li//text()').extract()
    

    您实际上并不需要 Selenium,而且我相信对于这个简单的问题来说这将是一个矫枉过正的问题。使用您的浏览器(我目前使用的是 Chrome),按 F12 打开开发者工具。转到其中一个类别页面,然后在开发人员窗口中打开 Network 选项卡。如果这里有任何内容,请单击 Clear 按钮将其清除一下。现在向下滚动,直到您看到正在加载其他项目,您将看到 Network 面板中列出了其他请求。按 Documents (1) 过滤它们,然后单击左窗格中的请求 (2)。您可以看到请求的 URL (3) 和需要发送的查询参数 (4)。注意 start 参数,这将是最重要的,因为您必须多次调用此请求,同时增加此值以获取新项目。您可以在 Preview 窗格 (5) 中查看响应,您将看到来自服务器的请求正是您所需要的,更多项目。您用于项目的规则也应该选择这些链接。

    有关使用 Firebug 进行抓取的更详细概述,您可以查看official documentation。

    由于不需要为您的目的使用 Selenium,因此我将仅添加一些链接来说明如何将 Selenium 与 Scrapy 一起使用,如果需要的话:

    https://gist.github.com/cheekybastard/4944914 https://gist.github.com/irfani/1045108 http://snipplr.com/view/66998/

【讨论】:

以上是关于使用 scrapy 从 Flipkart 中抓取数据的主要内容,如果未能解决你的问题,请参考以下文章

分布式爬虫:使用Scrapy抓取数据

使用 Scrapy 抓取 Python 数据

使用scrapy抓取电子商务

使用 scrapy 抓取网站

Python爬虫编程思想(156):使用Scrapy抓取天气预报数据

Python爬虫编程思想(156):使用Scrapy抓取天气预报数据