下文件,抓網頁,你常用的curl竟還有這功能!會的已經去大廠了

引言

curl 是一個軟件包,由命令行工具和使用URL語法傳輸數據的庫組成。

curl 支持多種協議,如DICT、FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMTP、SMTPS、Telnet和TFTP。

本文用實例深度演示 curl 的詳細用法。

下文件,抓網頁,你常用的curl竟還有這功能!會的已經去大廠了

下載單個文件

下面的命令將獲取URL的內容並將其顯示在STDOUT中(即在你的終端上)。

<code>curl URL/<code>

要將輸出存儲到文件中,您可以將其重定向,如下所示。這還將顯示一些額外的下載統計信息。

<code>curl URL > output.html/<code>


將cURL輸出保存到文件

我們可以使用-o/-O選項將curl命令的結果保存到文件中。

  • -o(小寫o)結果將保存在命令行中提供的文件名中。
  • -O(大寫O)將採用URL中的文件名,並將其用作存儲結果的文件名
<code>curl -o gettext.html URL/<code>

現在,頁面URL將保存在名為“gettext.html”的文件中。你還會注意到,當使用-o選項運行curl時,它會顯示下載的進度表。

當你使用curl-O(大寫O)時,它會使用URL後綴文件名,並將內容保存在本地。

注意:當cURL必須將數據寫入終端時,它會禁用進度表,以避免打印時的混亂。我們可以使用‘>’|‘-o’|‘-O’選項將結果移動到文件中


一次下載多個頁面

通過在命令行上指定URL,我們可以一次下載多個文件。

<code>curl -O URL1 -O URL2/<code>

下面的命令將下載a.html和b.html,並將其以對應的名稱保存在當前目錄下。

<code>curl -O URL/a.html -O URL/b.html/<code>

當我們如上所述從同一服務器下載多個文件時,cURL將會嘗試複用該連接。


使用-L選項跟隨請求頭HTTP Location

默認情況下,cURL不跟隨HTTP Location標頭。它也稱為重定向

當請求的網頁移動到另一個位置時,HTTP Location標頭將作為響應發送,它將顯示實際網頁所在的位置。

例如,當用戶在瀏覽器中鍵入a.com時,它將自動重定向到b.com。這是基於HTTP Location標頭完成的,如下所示。

<code>curl a.com

<title>302 Moved/<title>

302 Moved


The document has moved
/<code>

上述信息也表明請求地址被永久重定向(302)到了其他地址。

我們可以使用-L選項堅持curl遵循重定向,使它下載最終的目標頁面。

<code>curl -L a.com/<code>


斷點續傳

使用curl-C選項,您可以繼續下載由於某種原因已經停止的下載。當下載大文件,但網絡被中斷時,這將很有幫助。

如果我們使用“-C -”選項,那麼cURL將找到斷點並開始恢復下載

我們還可以給出一個偏移量‘-C’。將從源文件的開頭跳過給定的偏移量字節

下面測試一下。使用curl開始大文件的下載,然後在下載之間按Ctrl-C組合鍵停止下載。

<code>curl -O URL
############## 42.1%/<code>

下面額#表示進度條,下載停止在42.1%。

使用“curl -C -”,我們可以從前面停止的地方繼續下載。現在,下載進度將從42.1%繼續。

<code>curl -C - -O URL
############### 42.1%/<code>


限制下載速度

你可以使用-limit-rate選項限制數據的傳輸量,將最大傳輸速率指定為參數。

<code> curl --limit-rate 50k -O UTL/<code>

上述命令將數據傳輸限制為50kb/秒。在短時間內,curl可以使用較高的傳輸速率。但平均而言,它將達到50kb/秒左右。可以使用大文件進行速度測試。


僅當文件在給定時間之前/之後被修改時才下載

我們可以使用curl中的-z選項獲取在特定時間之後修改的文件。這對FTP和HTTP都有效。

<code>curl -z 2012-03-04 URL/<code>

上述命令僅當URL文件晚於給定日期和時間時,上述命令才會下載。

<code>curl -z -2012-03-04 URL/<code>

上述命令正好反過來,僅當URL文件早於給定日期時間才進行下載。

有關日期表達式支持的各種語法,請參考 man curl_getdate。


在cURL中傳遞HTTP身份驗證

有時,網站需要用戶名和密碼才能查看內容(可以使用.htaccess文件)。在-u選項的幫助下,我們可以將這些憑據從cURL傳遞到Web服務器,如下所示。

<code>curl -u username:password URL/<code>

默認情況下,cURL使用基本HTTP身份驗證,我們可以使用-ntlm | -digest指定其他身份驗證方法。


從FTP服務器下載資源

cURL還可以用於從FTP服務器下載文件。如果給定的FTP路徑是目錄,則默認情況下將列出特定目錄下的文件。

<code>curl -u user:password -O ftp://ftp_server/path/to/file/readme/<code>

上述命令將會直接下載FTP服務器上的readme文件。

<code>curl -u user:password -O ftp://ftp_server/path/to/file//<code>

上述命令則羅列出該目錄下所有的目錄和文件。


模糊匹配下載路徑

cURL支持URL中給定的範圍。當給定範圍時,將下載該範圍內匹配的文件。從FTP鏡像站點下載軟件包會很有幫助。

<code> curl ftp://ftp_server/path/to/dest/[a-z]//<code>

這樣會羅列出所有從dest/a/ 到 dest/z/ 目錄下的所有文件和目錄。


上傳文件到FTP服務器

cURL還可以用於通過-T選項將文件上傳到FTP服務器。

<code>curl -u user:password -T build.tar.gz ftp://ftp_server/path/to/dest//<code>

上述命令把壓縮包 build.tar.gz 推送到FTP服務器目錄。

<code>curl -u user:password -T "{file1,file2}" ftp://ftp_server//<code>

上述命令則是上傳多個文件到FTP服務器。

還有一個黑魔法,就是“-”,使用管道處理,獲取stdin信息流,並經由cURL上傳到FTP服務器。

<code>echo blablabla | curl -u user:password -T - ftp://ftp_server/path/summary.log/<code>


更詳細的輸出

Linux下的同學應該很熟悉,多加幾個-v就可以了。cURL也是如此。

<code>curl -vvv URL/<code>

加到3個-v,請求的握手過程都給打印出來了。


通過代理下載文件

我們可以使用-x選項指定curl來使用代理執行特定的操作,需要指定代理的主機和端口。

<code>curl -x proxy_ip:port URL/<code>

使用長選項更好記。

<code>curl --proxy proxy_ip:port URL/<code>


使用SMTP協議發郵件

cURL還可用於通過SMTP協議發送郵件。你應該指定發件人地址、收件人地址和郵件服務器IP地址,如下所示。

<code>curl --mail-from [email protected] --mail-rcpt [email protected] smtp://mailserver.com/<code>

一旦輸入上述命令,它將等待用戶向郵件提供數據。編寫完消息後,請鍵入.(英文句號)作為最後一行,將立即發送電子郵件。

<code>Subject: Testing
This is a test mail
./<code>


寫在最後

cURL提供的能力,不亞於生態完整的瀏覽器,更多用法等你來使用。


分享到:


相關文章: