Scrapy保存可下载的文件

时间:2017-07-19 03:38:18

标签: python web-scraping scrapy scrapy-spider

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

这是我到目前为止所拥有的 蜘蛛类

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):
    ...

是否有一种简单的方法可以检测链接是否以文件扩展名结尾并保存到该文件扩展名?我目前拥有的将保存为.html,无论扩展名如何。

我认为我可以删除

filename = '%s.html' % page

它会保存为自己的扩展名,但有些情况下我想保存为html,例如,如果它以aspx结尾

2 个答案:

答案 0 :(得分:1)

试试这个......

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]

可能想要检查是否返回为空 - 对于“http://google.com”等最后没有.format的情况。

答案 1 :(得分:0)

我最终做了

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