Я пытаюсь получить веб-страницу из следующего URL-адреса:
http://www.medicare.gov/find-a-doctor/provider-results.aspx?searchtype=OHP&specgrpids=922&loc=43615&pref=No&gender=Unknown&dist=25&lat=41.65603&lng=-83.66676
Он работает, когда я вставляю его в браузер, но когда я запускаю его через cURL, я получаю страницу со следующей ошибкой: «Один или несколько параметров строки запроса запрошенного URL неверны или имеют неожиданное значение, пожалуйста, исправьте и повторите попытку».
Кажется, что это не имеет значения, если я предоставляю другой userAgent или referrer. Существует перенаправление, поэтому я использую CURLOPT_FOLLOWLOCATION.
Вот мой код:
$ch = curl_init($page); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $html = curl_exec($ch); curl_close($ch); echo $html;
Любые мысли о том, почему такой запрос будет работать в браузере, а не cURL?
Ваш браузер отправляет файлы cookie, которых нет в CURL. Проверьте файлы cookie, которые вы отправляете на сайт, используя инструменты браузера или Fidler – вам нужно будет передать то же самое.
Проблема заключалась в использовании файлов cookie. Для ответа на этот конкретный сайт необходимо было установить cookie ASP.NET_SessionId. Я добавил следующее к моему запросу cURL:
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); curl_setopt($ch, CURLOPT_COOKIE, 'ASP.NET_SessionId=ho1pqwa0nb3ys3441alenm45; path=/; domain=www.medicare.gov');
Я не знаю, будет ли какой-либо идентификатор сеанса работать, но он попробовал пару случайных, и все они работали.