使用scrapy从flipkart上刮掉数据

时间:2014-12-07 16:08:13

标签: python-2.7 selenium web-scraping scrapy

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

我已经为我的蜘蛛使用了以下代码 来自scrapy.contrib.spiders导入CrawlSpider,规则

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

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

  1. 一个问题是我无法找到控制抓取和报废的方法。
  2. 第二个flipkart在其类别页面上使用ajax,并在用户滚动到底部时显示更多产品。
  3. 我已经阅读了其他答案并评估了硒可能有助于解决问题。但是我找不到一种正确的方法来实现它。
  4. 欢迎提出建议.. :)

    其他详细信息

    我之前使用过类似的方法

    我使用的第二条规则是

    规则(LinkExtractor(允许= [' /(。?)/ pr?(。?)']),' parse_category',关注= 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 个答案:

答案 0 :(得分:3)

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

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

    enter image description here

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

  3. 由于没有必要为您的目的使用Selenium,我将不会涵盖这一点,只是添加一些链接,显示如何使用Selenium和Scrapy,如果需要的话: