首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于以正确格式导出csv文件的Scrapy管道

用于以正确格式导出csv文件的Scrapy管道
EN

Stack Overflow用户
提问于 2015-04-29 19:58:36
回答 2查看 23.8K关注 0票数 18

我根据下面alexce的建议做了改进。我需要的是像下面的图片。但是,每一行/每行都应该是一个评论:带有日期、评级、评论文本和链接。

我需要让项目处理器处理每个页面的每个评论。

目前,TakeFirst()只对页面进行第一次审查。所以10页,我只有10行/行,如下图所示。

爬虫代码如下:

代码语言:javascript
复制
import scrapy
from amazon.items import AmazonItem

class AmazonSpider(scrapy.Spider):
   name = "amazon"
   allowed_domains = ['amazon.co.uk']
   start_urls = [
    'http://www.amazon.co.uk/product-reviews/B0042EU3A2/'.format(page) for      page in xrange(1,114)

]

def parse(self, response):
    for sel in response.xpath('//*[@id="productReviews"]//tr/td[1]'):
        item = AmazonItem()
        item['rating'] = sel.xpath('div/div[2]/span[1]/span/@title').extract()
        item['date'] = sel.xpath('div/div[2]/span[2]/nobr/text()').extract()
        item['review'] = sel.xpath('div/div[6]/text()').extract()
        item['link'] = sel.xpath('div/div[7]/div[2]/div/div[1]/span[3]/a/@href').extract()

        yield item
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-30 23:11:12

我是从头开始的,下面的爬行器应该可以运行

scrapy crawl amazon -t csv -o Amazon.csv --loglevel=INFO

这样打开带有电子表格的CSV-File就会显示给我

希望这能有所帮助:-)

代码语言:javascript
复制
import scrapy

class AmazonItem(scrapy.Item):
    rating = scrapy.Field()
    date = scrapy.Field()
    review = scrapy.Field()
    link = scrapy.Field()

class AmazonSpider(scrapy.Spider):

    name = "amazon"
    allowed_domains = ['amazon.co.uk']
    start_urls = ['http://www.amazon.co.uk/product-reviews/B0042EU3A2/' ]

    def parse(self, response):

        for sel in response.xpath('//table[@id="productReviews"]//tr/td/div'):

            item = AmazonItem()
            item['rating'] = sel.xpath('./div/span/span/span/text()').extract()
            item['date'] = sel.xpath('./div/span/nobr/text()').extract()
            item['review'] = sel.xpath('./div[@class="reviewText"]/text()').extract()
            item['link'] = sel.xpath('.//a[contains(.,"Permalink")]/@href').extract()
            yield item

        xpath_Next_Page = './/table[@id="productReviews"]/following::*//span[@class="paging"]/a[contains(.,"Next")]/@href'
        if response.xpath(xpath_Next_Page):
            url_Next_Page = response.xpath(xpath_Next_Page).extract()[0]
            request = scrapy.Request(url_Next_Page, callback=self.parse)
            yield request
票数 29
EN

Stack Overflow用户

发布于 2015-04-30 06:08:47

如果由于某种原因使用-t csv (弗兰克在评论中提出的)对你不起作用,你可以直接使用内置的CsvItemExporter in the custom pipeline,例如:

代码语言:javascript
复制
from scrapy import signals
from scrapy.contrib.exporter import CsvItemExporter


class AmazonPipeline(object):
    @classmethod
    def from_crawler(cls, crawler):
        pipeline = cls()
        crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
        crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
        return pipeline

    def spider_opened(self, spider):
        self.file = open('output.csv', 'w+b')
        self.exporter = CsvItemExporter(self.file)
        self.exporter.start_exporting()

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        self.file.close()

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

您需要添加到ITEM_PIPELINES

代码语言:javascript
复制
ITEM_PIPELINES = {
    'amazon.pipelines.AmazonPipeline': 300
}

此外,我将使用具有输入和输出处理器的Item Loader来连接评论文本,并用空格替换新行。创建ItemLoader类:

代码语言:javascript
复制
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst, Join, MapCompose


class AmazonItemLoader(ItemLoader):
    default_output_processor = TakeFirst()

    review_in = MapCompose(lambda x: x.replace("\n", " "))
    review_out = Join()

然后,使用它来构造一个Item

代码语言:javascript
复制
def parse(self, response):
    for sel in response.xpath('//*[@id="productReviews"]//tr/td[1]'):
        loader = AmazonItemLoader(item=AmazonItem(), selector=sel)

        loader.add_xpath('rating', './/div/div[2]/span[1]/span/@title')
        loader.add_xpath('date', './/div/div[2]/span[2]/nobr/text()')
        loader.add_xpath('review', './/div/div[6]/text()')
        loader.add_xpath('link', './/div/div[7]/div[2]/div/div[1]/span[3]/a/@href')

        yield loader.load_item()
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29943075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档