下载大于特定大小的文件

时间:2015-10-06 15:31:31

标签: bash perl shell web-scraping web-crawler

我有Files.txt,其中包含Excel文件的网址列表:

http://www.bcheadset.ca/applicant.xlsx
http://www.bcheadset.ca/fte.xlsx
http://www.iutox.org/TRTF_Matrix2012_Oct.xlsx
http://www.journalprices.com/2013_FinalSummaryForWeb.xlsx
http://www.camts.org/7__2013_Aircraft_Checklist.xlsx
http://www.nanotr11.org/poster_program.xlsx
http://www.vliruos.be/media/6352100/nss2015_annex_3_budget.xlsx
...

我想要的是下载(通过wget)大于10Mo的文件。

要在下载文件之前验证文件是否大于10Mo,我们可以使用curl --head。例如,curl --head http://www.bcheadset.ca/fte.xlsx返回

HTTP/1.1 200 OK
Content-Length: 3158847
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Last-Modified: Mon, 27 Jul 2015 22:16:45 GMT
Accept-Ranges: bytes
ETag: "ffb49fecb9c8d01:c05"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Tue, 06 Oct 2015 15:14:27 GMT

Content-Length开始,我们可以验证它是否大于10Mo

我的问题是如何通过BashPerl来自动执行此操作。特别是我不知道如何提取Content-Length并进行比较......

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

您可以使用LWPperl并发送HEAD请求,获取响应标头。像这样:

#!/usr/bin/env perl
use strict;
use warnings;

use LWP;
use Data::Dumper;

my $request = HTTP::Request -> new ( HEAD => 'http://www.google.com' ); 
my $agent = LWP::UserAgent -> new;
my $response = $agent -> request ( $request );
print $response -> header ( 'Content-Length'); 

然后使用LWP执行GET而不是HEAD您想要的文件。

答案 1 :(得分:1)

为了适应各种HTTP表单及其内容,某些类型的模式匹配可能是谨慎的。下面是如何在shell中使用glob匹配来完成此任务的粗略示例:

#!/bin/sh


BUFFER=$(curl --head http://www.bcheadset.ca/fte.xlsx )

HOLD=""

TAKENEXT=0


for i in $BUFFER
do case "$i" in
       Content-Length:)
       TAKENEXT=1
       ;;
    *) if [ "$TAKENEXT" -eq 1 ]
       then HOLD="$i"
            break
       fi
       ;;
    esac
done

printf "SIZE was:  %s\n" "$HOLD"

以下是使用grep的简单方法:

SIZE=$(curl --head http://www.bcheadset.ca/fte.xlsx | grep 'Content-Length:' | awk '{print $2}')

printf "%s\n" "$SIZE"