Scrapy 保存可下载文件

Scrapy Save Downloadable Files

我正在编写一个 scrapy 网络爬虫,它可以从我访问的页面中保存 html。我还想用文件扩展名保存我抓取的文件。

这是我目前所拥有的 蜘蛛class

class MySpider(CrawlSpider):
    name = 'my name'  
    start_urls = ['my url']
    allowed_domains = ['my domain']
    rules = (Rule (LinkExtractor(allow=()), callback="parse_item", follow= True),
  )

    def parse_item(self,response): 
        item = MyItem()
        item['url'] = response.url
        item['html'] = response.body
        return item

pipelines.py

save_path = 'My path'

if not os.path.exists(save_path):
    os.makedirs(save_path)

class HtmlFilePipeline(object):
    def process_item(self, item, spider):
        page = item['url'].split('/')[-1]
        filename = '%s.html' % page
        with open(os.path.join(save_path, filename), 'wb') as f:
            f.write(item['html'])
        self.UploadtoS3(filename)

    def UploadtoS3(self, filename):
    ...

有没有一种简单的方法来检测 link 是否以文件扩展名结尾并保存到该文件扩展名?无论扩展名如何,我目前拥有的内容都会保存到 .html。

我想我可以删除

filename = '%s.html' % page

并且它会保存为它自己的扩展名,但有些情况下我想保存为 html 而不是,例如如果它以 aspx

结尾

试试这个...

import os

extension = os.path.splitext(url)[-1].lower()
#check if URL has GET request parameters and remove them (page.html?render=true)
if '?' in extension:
    extension = extension.split('?')[0]

可能要检查 returns 是否为空 - 对于诸如“http://google.com”这样的情况,其中末尾没有 .format

我最后做了

   if not '.' in page:
        fileName = '%s.html' % page        
    else:
        fileName = page