Почему завиток не работает, но работает wget?

Я использую curl и wget для получения этого URL: http://opinionator.blogs.nytimes.com/2012/01/19/118675/

Для curl он не возвращает никакого вывода, но с wget возвращает весь HTML-источник:

Вот две команды. Я использовал один и тот же пользовательский агент, и оба они поступают с одного и того же IP-адреса и следуют за перенаправлениями. URL-адрес точно такой же. Для curl он возвращается сразу после 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" 

Если NY Times может клонировать, а не возвращать источник, чтобы завивать, что может быть другим в заголовке, зависание отправляется? Я предполагал, что, поскольку пользовательский агент тот же, запрос должен выглядеть точно так же от обоих этих запросов. Какие еще "следы" следует проверить?

Ответ 1

Способ решения состоит в том, чтобы проанализировать ваш запрос curl, выполнив curl -v ... и ваш запрос wget, выполнив wget -d ..., который показывает, что завиток перенаправляется на страницу входа

> 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

В запросе, отправленном curl, никогда не добавляется файл cookie.

Самый простой способ изменить вашу команду curl и получить желаемый ресурс - добавить -c cookiefile к вашей команде curl. Это сохраняет файл cookie в неиспользуемом временном файле "cookie jar", называемом "cookiefile", тем самым позволяя завитка отправлять необходимые файлы cookie с последующими запросами.

Например, я добавил флаг -c x непосредственно после "curl", и я получил результат так же, как из wget (кроме того, что wget записывает его в файл, а curl выводит его на STDOUT).