2014-01-08 91 views
10

我同時使用捲曲和wget得到這個網址:http://opinionator.blogs.nytimes.com/2012/01/19/118675/爲什麼捲曲不起作用,但wget的作品?

對於捲曲,它返回任何輸出,但是wget的,它返回整個HTML源代碼:

這裏有2個命令。我使用了相同的用戶代理,並且都來自相同的IP,並且遵循重定向。該URL完全相同。對於捲曲,它在1秒後立即返回,所以我知道這不是超時問題。

curl -L -s "http://opinionator.blogs.nytimes.com/2012/01/19/118675/" --max-redirs 10000 --location --connect-timeout 20 -m 20 -A "Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" 2>&1 

wget http://opinionator.blogs.nytimes.com/2012/01/19/118675/ --user-agent="Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" 

如果紐約時報可能是僞裝的,而不是返回源捲曲,這可能是在頭捲曲不同的發送?我假設用戶代理是相同的,那麼這兩個請求的請求應該看起來完全一樣。我應該檢查什麼其他「腳印」?

+0

這一個會幫助你嗎? http://stackoverflow.com/questions/8298727/curl-hanging-for-15-seconds-when-sending-head-requests –

+0

根本不幫助:( –

+0

我建議在您的curl請求中添加'-v'標誌向您展示所有正在發生的事情。添加到您的wget請求中的'-d'標誌向您顯示了成功的wget請求發生了什麼情況。兩個程序都重定向到登錄頁面,但wget成功檢索到目標資源,但是curl不斷重定向,直到它得到一個不好的重定向並放棄。從簡單的看看輸出,看起來wget正確地將cookie發送回nytimes.com,而curl從不發送任何cookie返回。 –

回答

12

要解決的途徑就是去分析做curl -v ...curl請求,並通過做wget -d ...您的wget要求這表明捲曲被重定向到登錄頁面

> GET /2012/01/19/118675/ HTTP/1.1 
> User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 
> Host: opinionator.blogs.nytimes.com 
> Accept: */* 
> 
< HTTP/1.1 303 See Other 
< Date: Wed, 08 Jan 2014 03:23:06 GMT 
* Server Apache is not blacklisted 
< Server: Apache 
< Location: http://www.nytimes.com/glogin?URI=http://opinionator.blogs.nytimes.com/2012/01/19/118675/&OQ=_rQ3D0&OP=1b5c69eQ2FCinbCQ5DzLCaaaCvLgqCPhKP 
< Content-Length: 0 
< Content-Type: text/plain; charset=UTF-8 

隨後重定向的循環(你必須注意,因爲你已經設置了--max-redirs標誌)。

在另一方面,wget遵循相同的序列,除了它返回cookie通過nytimes.com與其後續請求(多個)

---request begin--- 
GET /2012/01/19/118675/?_r=0 HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 
Accept: */* 
Host: opinionator.blogs.nytimes.com 
Connection: Keep-Alive 
Cookie: NYT-S=0MhLY3awSMyxXDXrmvxADeHDiNOMaMEZFGdeFz9JchiAIUFL2BEX5FWcV.Ynx4rkFI 

通過捲曲發送的請求從不包含cookie中設置。

我看到修改curl命令並獲得所需資源的最簡單方法是在您的curl命令中添加-c cookiefile。這將cookie存儲在另外未使用的名爲「cookiefile」的臨時「cookie jar」文件中,從而使curl能夠將隨後請求發送所需的cookie。例如,我在「curl」之後直接添加了標誌-c x,並且我獲得了與wget類似的輸出(除了wget將它寫入文件並將其捲曲打印到STDOUT中)。

+0

- v通常非常有幫助 –