使用文件项管道时如何整理scrapy的csv输出

时间:2016-06-21 07:57:06

标签: scrapy

在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,标题

2 个答案:

答案 0 :(得分:1)

如果您想要自定义格式等,您可能只想使用好的“scrapy item pipelines.

在管道方法process_itemclose_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行,没有额外的标点字符进行预处理