【问题标题】:How to enable overwriting a file everytime in scrapy item export?如何在scrapy项目导出中每次都覆盖文件?
【发布时间】:2016-10-30 09:30:47
【问题描述】:

我正在抓取一个返回 urls 列表的网站。 示例 - scrapy crawl xyz_spider -o urls.csv

它现在工作得很好,我想要的是在文件中添加新的urls.csv 而不是追加data。我可以做任何参数传递来使其启用吗?

【问题讨论】:

    标签: python csv scrapy scrapy-spider scrapy-pipeline


    【解决方案1】:

    不幸的是,scrapy 目前无法做到这一点。
    不过在 github 上有一个改进建议:https://github.com/scrapy/scrapy/issues/547

    但是,您可以轻松地将输出重定向到标准输出并将其重定向到文件:

    scrapy crawl myspider -t json --nolog -o - > output.json
    

    -o - 表示输出到减号,在这种情况下减号表示标准输出。
    您还可以在运行scrapy之前创建一些别名来删除文件,例如:

    alias sc='-rm output.csv && scrapy crawl myspider -o output.csv'
    

    【讨论】:

    • 我的蜘蛛文件夹中有两个蜘蛛,当我运行上面的蜘蛛时,另一个蜘蛛正在读取该文件,它在其他蜘蛛中产生问题并且没有任何执行
    • 它就像执行一个蜘蛛,但两个蜘蛛都运行我不知道这种奇怪的行为
    • 您能详细说明一下吗?您必须同时运行蜘蛛并 1 写入 urls.csv 和另一个读取它?您尝试使用哪种方法输出 csv?
    • 它更像是一个不同的东西,但无论如何它值得问我有两个蜘蛛 a 和 b。我首先运行 a 并获取 output.csv,然后运行 ​​spider b 从 output.csv 获取 url 进行爬网,我试图使用命令 rm output.csv && scrapy crawl a -o output.csv 但spider b 抛出错误时我正在运行它找不到 output.csv
    • @NikhilParmar scrapy crawl a -o output.csv 自己生产什么东西吗?
    【解决方案2】:

    我通常通过将 Scrapy 作为 python 脚本运行并在调用 Spider 类之前打开文件来处理自定义文件导出。这为处理和格式化 csv 文件提供了更大的灵活性,甚至可以将它们作为 Web 应用程序的扩展运行或在云中运行。以下内容:

    import csv
    
    if __name__ == '__main__':            
            process = CrawlerProcess()
    
            with open('Output.csv','wb') as output_file:
                mywriter = csv.write(output_file)
                process.crawl(Spider_Class, start_urls = start_urls)
                process.start() 
                process.close()                             
    

    【讨论】:

    • csv.writerprocess.close() 不存在。无论如何,很好的解决方案。
    【解决方案3】:

    您可以打开和关闭文件,这样它会删除文件的内容。

    class RestaurantDetailSpider(scrapy.Spider):
    
        file = open('./restaurantsLink.csv','w')
        file.close()
        urls = list(open('./restaurantsLink.csv')) 
        urls = urls[1:]
        print "Url List Found : " + str(len(urls))
    
        name = "RestaurantDetailSpider"
        start_urls = urls
    
        def safeStr(self, obj):
            try:
                if obj == None:
                    return obj
                return str(obj)
            except UnicodeEncodeError as e:
                return obj.encode('utf8', 'ignore').decode('utf8')
            return ""
    
        def parse(self, response):
            try :
                detail = RestaurantDetailItem()
                HEADING = self.safeStr(response.css('#HEADING::text').extract_first())
                if HEADING is not None:
                    if ',' in HEADING:
                        HEADING = "'" + HEADING + "'"
                    detail['Name'] = HEADING
    
                CONTACT_INFO = self.safeStr(response.css('.directContactInfo *::text').extract_first())
                if CONTACT_INFO is not None:
                    if ',' in CONTACT_INFO:
                        CONTACT_INFO = "'" + CONTACT_INFO + "'"
                    detail['Phone'] = CONTACT_INFO
    
                ADDRESS_LIST = response.css('.headerBL .address *::text').extract()
                if ADDRESS_LIST is not None:
                    ADDRESS = ', '.join([self.safeStr(x) for x in ADDRESS_LIST])
                    ADDRESS = ADDRESS.replace(',','')
                    detail['Address'] = ADDRESS
    
                EMAIL = self.safeStr(response.css('#RESTAURANT_DETAILS .detailsContent a::attr(href)').extract_first())
                if EMAIL is not None:
                    EMAIL = EMAIL.replace('mailto:','')
                    detail['Email'] = EMAIL
    
                TYPE_LIST = response.css('.rating_and_popularity .header_links *::text').extract()
                if TYPE_LIST is not None:
                    TYPE = ', '.join([self.safeStr(x) for x in TYPE_LIST])
                    TYPE = TYPE.replace(',','')
                    detail['Type'] = TYPE
    
                yield detail
            except Exception as e:
                print "Error occure"
                yield None
    
        scrapy crawl RestaurantMainSpider  -t csv -o restaurantsLink.csv
    

    这将创建 restaurantLink.csv 文件 我在下一个蜘蛛 RestaurantDetailSpider 中使用它。

    因此您可以运行以下命令——它将删除并创建一个新文件restaurantLink.csv,我们将在上述蜘蛛中使用该文件,并且每当我们运行蜘蛛时它都会被覆盖:

    rm restaurantsLink.csv && scrapy crawl RestaurantMainSpider -o restaurantsLink.csv -t csv
    

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 2012-08-27
      • 2017-09-22
      • 2017-01-25
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      相关资源
      最近更新 更多