在SO社区的大量帮助之后,我有一个scrapy抓取工具,它会保存抓取的网站的网页,但我想要清理创建的csv文件--output
目前的示例行似乎是
"[{'url': 'http://example.com/page', 'path': 'full/hashedfile', 'checksum': 'checksumvalue'}]",http://example.com/page,2016-06-20 16:10:24.824000,http://example.com/page,My Example Page
如何让csv文件包含每行1个文件的详细信息(无额外网址:),路径值包含.html或.txt等扩展名?
my items.py如下
class MycrawlerItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
crawldate = scrapy.Field()
pageurl = scrapy.Field()
files = scrapy.Field()
file_urls = scrapy.Field()
我的规则回调是
def scrape_page(self,response):
page_soup = BeautifulSoup(response.body,"html.parser")
ScrapedPageTitle = page_soup.title.get_text()
item = MycrawlerItem()
item['title'] =ScrapedPageTitle
item['crawldate'] = datetime.datetime.now()
item['pageurl'] = response.url
item['file_urls'] = [response.url]
yield item
在抓取工具日志中显示
2016-06-20 16:10:26 [scrapy] DEBUG: Scraped from <200 http://example.com/page>
{'crawldate': datetime.datetime(2016, 6, 20, 16, 10, 24, 824000),
'file_urls': ['http://example.com/page'],
'files': [{'checksum': 'checksumvalue',
'path': 'full/hashedfile',
'url': 'http://example.com/page'}],
'pageurl': 'http://example.com/page',
'title': u'My Example Page'}
每个csv线的理想结构是
CRAWLDATE,FILE_URL,FILE_PATH,标题
答案 0 :(得分:1)
如果您想要自定义格式等,您可能只想使用好的“scrapy item pipelines.
在管道方法process_item
或close_spider
中,您可以将项目写入文件。像:
def process_item(self, item, spider):
if not getattr(spider, 'csv', False):
return item
with open('{}.csv'.format(spider.name), 'a') as f:
writer = csv.writer(f)
writer.writerow([item['crawldate'],item['title']])
return item
每次使用<spider_name>.csv
标记运行蜘蛛时,这将写出csv
文件,即scrapy crawl twitter -a csv=True
如果您使用spider_open
方法打开文件并在spider_close
中将其关闭,则可以提高效率,但其他情况则相同。
答案 1 :(得分:0)
我能够通过指定xml output选项而不是csv
来避免清理csv数据的需要输出为.xml然后导入Excel,为我提供了一个更清晰的数据集,每页1行,没有额外的标点字符进行预处理