Проблема с парсингом (php)
5 сообщений
#16 лет назад
Никогда не возникало проблем с парсингом, а тут столкнулась, и не могу понять в чем дело.Есть GET запрос:
ссылка
Вводим его в броузер и вответ получаем XML с одной пустой строкой.
Строка пустая, потому как броузер не передал сookie.
Вводим этот запрос еще раз и в ответ получаем ХML со строкой данных, т.к . второй запрос ушел с сookie, полученном в ответе первого запроса.
Теперь все это пробую сделать на php:
function SOCK80 ($url, $request, $response)
{
if (!$sock = fsockopen ($url, 80))
return false;
if (!@fwrite ($sock, $request))
return false;
while (!feof ($sock))
$response.= @fread ($sock, 8192);
fclose ($sock);
return $response;
}
$url = 'ссылка;;
$request = "GET /php/engine.php?act=load_xml&table_name=closeouts&posStart=0&count=1 HTTP/1.1\r\nHost: ссылка Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\r\nAccept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\nAccept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\n\r\n";
$response = SOCK80 ($url, $request, ''

preg_match ('|Cookie:\s(.*?);|', $response, $arr);
$cookie = $arr;
$request = "GET /php/engine.php?act=load_xml&table_name=closeouts&posStart=0&count=1 HTTP/1.1\r\nHost: ссылка Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\r\nAccept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\nAccept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\nCookie: ".$cookie."\r\n\r\n";
$response = SOCK80 ($url, $request, ''

echo $response;
В ответе получаю XML с пустой строкой

Через снифер вижу, что броузер и скрипт отправляют абсолютно идентичные запросы с сookie,
но броузер возвращает XML со строкой данных, а скрипт с пустой строкой.
В чем может быть проблемма?
Если кто-то поможет решить, гарантирую небольшой бонус в 10WMZ.
Помогите!
269 сообщений
#16 лет назад
Смотрите куки, которые отправляете.Лучше их не копировать, а переписать заново.
В любом случае одна из кук должнв быть PHPSESSID, вторая - tosAgree со значением yes.
Только после этого у меня получилось забрать правильную XMLку.
Если нужно - через несколько минут могу выдать рабочий кусок кода.
5 сообщений
#16 лет назад
Покажите пожалуйста код.В моем коде добавление сookie: tosAgree=yes не помогло.
269 сообщений
#16 лет назад
Цитата ("VikaS"):Покажите пожалуйста код.
В моем коде добавление сookie: tosAgree=yes не помогло.
NOTE! Это всего лишь пример.
Файл test.php для командной строки:
$fp = fsockopen("www.freshdrop.net", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
echo("Start connection to the Main Site\n\r\n\r");
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: ссылка;;
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$content = '';
while (!feof($fp)) {
$content.= fgets($fp, 128);
}
fclose($fp);
preg_match("/Cookie:(.*);/",$content,$match);
echo("Loaded Cookie:\n\r\n\r");
print_r($match);
}
$fp = fsockopen("www.freshdrop.net", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
echo("Start connection to the XML\n\r\n\r");
$out = "GET /php/engine.php?act=load_xml&table_name=closeouts&posStart=0&count=1 HTTP/1.1\r\n";
$out .= "Host: ссылка;;
$out .= "Cookie: ".$match."; tosAgree=yes";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$content = '';
while (!feof($fp)) {
$content.= fgets($fp, 128);
}
fclose($fp);
echo("Loaded XML:\n\r\n\r");
print_r($content);
}
запуск: /usr/bin/php test.php
Список лоадится нормально.
269 сообщений
#16 лет назад
Сама ошибка, скорее всего, в том, что при запросе любой сервер вместе с Cookie озвращает путь, для которого устанавливается Cookie:Cookie: PHPSESSID=26ec830b35bc71f1cf87cee35183d344; path=/
Но во втором запросе path для Cookie передавать не нужно, хотя он у вас при работе вашего скрипта передается. В итоге сервер с другой стороны не воспринимает вашу куку.
Я думаю, что ошибка заключается именно в этом. Дополнительно порою RFC, если нужно, посмотрю, что и как на самом деле.
5 сообщений
#16 лет назад
Цитата ("elhsmart"):Сама ошибка, скорее всего, в том, что при запросе любой сервер вместе с Cookie озвращает путь, для которого устанавливается Cookie:Cookie: PHPSESSID=26ec830b35bc71f1cf87cee35183d344; path=/
Но во втором запросе path для Cookie передавать не нужно, хотя он у вас при работе вашего скрипта передается. В итоге сервер с другой стороны не воспринимает вашу куку.
Я думаю, что ошибка заключается именно в этом. Дополнительно порою RFC, если нужно, посмотрю, что и как на самом деле.
elhsmart, спасибо!
Ваш код возвращает то, что нужно и бонус безусловно ваш (сообщите мне номер вашего кошелька).
Я вот только пока не поняла, почему не работает мой код. Куку я отправляла правильую, типа PHPSESSID=26ec830b35bc71f1cf87cee35183d344 в моем изначальном коде, и типа
PHPSESSID=26ec830b35bc71f1cf87cee35183d344; tosAgree=yes после вашего первого ответа.
Откуда вы решили, что я отправляла еще и patch ?
Еще раз большое спасибо за помощь.
PS А что такое RFC ?

269 сообщений
#16 лет назад
Цитата ("VikaS"):
elhsmart, спасибо!
Ваш код возвращает то, что нужно и бонус безусловно ваш (сообщите мне номер вашего кошелька).
Я вот только пока не поняла, почему не работает мой код. Куку я отправляла правильую, типа PHPSESSID=26ec830b35bc71f1cf87cee35183d344 в моем изначальном коде, и типа
PHPSESSID=26ec830b35bc71f1cf87cee35183d344; tosAgree=yes после вашего первого ответа.
Откуда вы решили, что я отправляла еще и patch ?
Еще раз большое спасибо за помощь.
Незачто. You are welcome.
Только что внимательно пересмотрел оба куска кода.
Было:
preg_match ('|Cookie:\s(.*?);|', $response, $arr);
$cookie = $arr;
Стало:
preg_match("/Cookie:(.*);/",$content,$match);
...
print_r($match);
Банальная ошибка в регулярке ^_^
Так что мне тоже нужно быть внимательнее.