我在抓这个页面:
http://www.mymcpl.org/cfapps/botb/movie.cfm
提取四个项目: 书,作家,电影,movie_year
我想将其保存在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的第一页。
答案 0 :(得分:2)
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,只需更改参数中的文件扩展名。