Python 使用scrapy在csv文件中逐行写入一个元素

Python 使用scrapy在csv文件中逐行写入一个元素,python,csv,web-scraping,scrapy,yield,Python,Csv,Web Scraping,Scrapy,Yield,我正在抓取这一页: 提取四项: 书,作者,电影,电影年 我想将其保存在CSV文件中,其中每行包含一部电影的记录 这是我写的蜘蛛: class simple_spider(scrapy.Spider): name = 'movies_spider' allowed_domains = ['mymcpl.org'] download_delay = 1 start_urls = ['http://www.mymcpl.org/cfapps/botb/movie.

我正在抓取这一页:

提取四项: 书,作者,电影,电影年

我想将其保存在CSV文件中,其中每行包含一部电影的记录

这是我写的蜘蛛:

class simple_spider(scrapy.Spider):
    name = 'movies_spider'
    allowed_domains = ['mymcpl.org']
    download_delay = 1


    start_urls = ['http://www.mymcpl.org/cfapps/botb/movie.cfm?browse={}'.format(letter) for letter in string.uppercase] # ['http://www.mymcpl.org/cfapps/botb/movie.cfm']


    def parse(self, response):
        xpaths = {'book':'//*[@id="main"]/tr[{}]/td[2]/text()[1]',
                  'author':'//*[@id="main"]/tr[{}]/td[2]/a/text()',
                  'movie':'//*[@id="main"]/tr[{}]/td[1]/text()[1]',
                  'movie_year':'//*[@id="main"]/tr[{}]/td[1]/a/text()'}

        data  = {key:[] for key in xpaths}
        for row in range(2,len(response.xpath('//*[@id="main"]/tr').extract()) + 1):
            for key in xpaths.keys():
                value = response.xpath(xpaths[key].format(row)).extract_first()
                data[key] = (value) 
        yield data.values()
要运行爬行器,请执行以下操作:

scrapy runspider m_spider.py output.csv
我这里有两个问题:

1) CSV文件的每一行不仅包含当前记录,还包含所有以前的记录 即使我没有在字典中添加值


2) 爬行器仅在抓取开始URL的第一页。

Scrapy已经内置了csv导出器。您所要做的就是生成项目,scrapy将这些项目输出到csv文件

def parse(self, response):
    xpaths = {'book':'//*[@id="main"]/tr[{}]/td[2]/text()[1]',
              'author':'//*[@id="main"]/tr[{}]/td[2]/a/text()',
              'movie':'//*[@id="main"]/tr[{}]/td[1]/text()[1]',
              'movie_year':'//*[@id="main"]/tr[{}]/td[1]/a/text()'}
    return {key:[] for key in xpaths}
那么就:

scrapy crawl myspider --output results.csv 

*注意csv部分,scrapy也可以输出到.json和.jl(json行)而不是csv,只需更改参数中的文件扩展名。

scrapy已经内置了csv导出器。您所要做的就是生成项目,scrapy将这些项目输出到csv文件

def parse(self, response):
    xpaths = {'book':'//*[@id="main"]/tr[{}]/td[2]/text()[1]',
              'author':'//*[@id="main"]/tr[{}]/td[2]/a/text()',
              'movie':'//*[@id="main"]/tr[{}]/td[1]/text()[1]',
              'movie_year':'//*[@id="main"]/tr[{}]/td[1]/a/text()'}
    return {key:[] for key in xpaths}
那么就:

scrapy crawl myspider --output results.csv 
*注意csv部分,scrapy也可以输出到.json和.jl(json行)而不是csv,只需更改参数中的文件扩展名