簡體   English   中英

用scrapy在csv文件中逐行寫一個元素

[英]Write one element by row in a csv file with scrapy

我正在抓取此頁面:

http://www.mymcpl.org/cfapps/botb/movie.cfm

提取四個項目:書籍,作者,電影,電影年

我想將其保存在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)蜘蛛只會抓取start_urls的第一頁。

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,只需在參數中更改文件擴展名即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM