如何在scrapy中提取相对于单行的多行数据

时间:2017-03-09 07:13:34

标签: python-2.7 scrapy

我正在尝试抓取此链接中给出的网页 - http://new-york.eat24hours.com/picasso-pizza/19053

在这里,我试图获取所有可能的详细信息,如地址和电话等。 所以,我已经提取了姓名,电话,地址,评论,评级。 但是我也想在这里提取餐厅的全套菜单(带价格的商品名称)。 所以,我还不知道如何将这些数据管理到csv的输出中。

单个网址的其余数据将为单个,但菜单中的项目总是不同。

下面是我目前的代码 -

import scrapy
from urls import start_urls

class eat24Spider(scrapy.Spider):
    AUTOTHROTTLE_ENABLED = True
    name = 'eat24'

    def start_requests(self):
        for x in start_urls:
            yield scrapy.Request(x, self.parse)

    def parse(self, response):

        brickset = response
        NAME_SELECTOR = 'normalize-space(.//h1[@id="restaurant_name"]/a/text())'
        ADDRESS_SELECTION = 'normalize-space(.//span[@itemprop="streetAddress"]/text())'
        LOCALITY = 'normalize-space(.//span[@itemprop="addressLocality"]/text())'
        REGION = 'normalize-space(.//span[@itemprop="addressRegion"]/text())'
        ZIP = 'normalize-space(.//span[@itemprop="postalCode"]/text())'
        PHONE_SELECTOR = 'normalize-space(.//span[@itemprop="telephone"]/text())'
        RATING = './/meta[@itemprop="ratingValue"]/@content'
        NO_OF_REVIEWS = './/meta[@itemprop="reviewCount"]/@content'
        OPENING_HOURS = './/div[@class="hours_info"]//nobr/text()'
        EMAIL_SELECTOR = './/div[@class="company-info__block"]/div[@class="business-buttons"]/a[span]/@href[substring-after(.,"mailto:")]'

        yield {
            'name': brickset.xpath(NAME_SELECTOR).extract_first().encode('utf8'),
            'pagelink': response.url,
            'address' : str(brickset.xpath(ADDRESS_SELECTION).extract_first().encode('utf8')+', '+brickset.xpath(LOCALITY).extract_first().encode('utf8')+', '+brickset.xpath(REGION).extract_first().encode('utf8')+', '+brickset.xpath(ZIP).extract_first().encode('utf8')),
            'phone' : str(brickset.xpath(PHONE_SELECTOR).extract_first()),
            'reviews' : str(brickset.xpath(NO_OF_REVIEWS).extract_first()),
            'rating' : str(brickset.xpath(RATING).extract_first()),
            'opening_hours' : str(brickset.xpath(OPENING_HOURS).extract_first())
        }

我很抱歉,如果我让这个令人困惑,但任何形式的帮助将不胜感激。 先感谢您!!

1 个答案:

答案 0 :(得分:0)

如果您想要提取完整的餐厅菜单,首先,您需要找到包含名称和价格的元素:

menu_items = response.xpath('//tr[@itemscope]')

之后,您可以简单地进行循环并迭代名称和价格的餐馆项目列表:

menu = []
for item in menu_items:
    menu.append({
        'name': item.xpath('.//a[@class="cpa"]/text()').extract_first(),
        'price': item.xpath('.//span[@itemprop="price"]/text()').extract_first()
        })

最后,您可以添加新的菜单'你的词典的关键:

yield {'menu': menu}

另外,我建议你使用scrapy项来存储抓取的数据: https://doc.scrapy.org/en/latest/topics/items.html

要在csv文件中输出数据,请使用scrapy Feed导出,键入console:

scrapy crawl yourspidername -o restaurants.csv