[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсер гугла
print_f
Всем доброго времени суток.
Возникла необходимость написать парсер результатов запроса гугла.
Опыта в РНР маловато, но кое чо все таки сваял. Но, к сожалению, наткнулся на капчу.

Привожу код, если не затруднит, укажите мне на мои ошибки.


$n = 1; //кол-во ссылок
$keyword = 'test';
for ($i=0; $i<$n; $i++) {
$link = parseGoogle($keyword,$i);
$c = count($link);
for ($j=0; $j<$c; $j++) {
echo $link[$j];
}
sleep(10+rand(0, 15));
}


function parseGoogle($keyword = 'test', $n = 15){
set_time_limit(0);
$keyword = str_replace(' ','+',$keyword);
$url = 'http://www.google.ru/search?q='.$keyword.'&num=100&filter=0&start='.$n.'0';
$curl = curl_init ();
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_TIMEOUT, 15);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_REFERER, 'http://google.ru');

$file = curl_exec ($curl);
curl_close ($curl);
$exp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";

if (preg_match_all("/$exp/siU", $file, $matches, PREG_SET_ORDER)) {
$c = count($matches);
for ($i=0; $i<$c; $i++) {
$links[] = $matches[$i][2];

}
}

return $links;

}


Заранее крайне благодарен.



Спустя 21 минута, 28 секунд (20.12.2011 - 14:23) Xes написал(а):
А капчу можно как то обойти, без анализа изображения картинки?
Если капча не обнавляется то можно попробвывать перебор если капча из 4 цифр наверное, теоретически сам незаганялся, этим вопросом. А у меня например при обрещении к скрипту если вышла лажа капча каждый рас переписывается в сесии.

Спустя 4 минуты, 52 секунды (20.12.2011 - 14:28) killer8080 написал(а):
Во первых правильно не так
$keyword = str_replace(' ','+',$keyword);

а так
$keyword = urlencode($keyword); 

во вторых нужно имитировать заголовки отправляемые браузером, как минимум юзер агент, чтоб не принимали тебя за бота.
Например
curl_setopt($curl, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 6.1; U; ru)');

Спустя 1 час, 21 минута, 26 секунд (20.12.2011 - 15:49) print_f написал(а):
Xes
капча 5-6 символов.. перебирать такую долго и нудно

killer8080
Спасибо, узерагент я из виду-то и упустил.. но все равно кидает на капчу, к сожалению dry.gif

Спустя 4 минуты, 28 секунд (20.12.2011 - 15:54) killer8080 написал(а):
print_f
попробуй задействовать куки и CURLOPT_FOLLOWLOCATION

Спустя 1 минута, 16 секунд (20.12.2011 - 15:55) print_f написал(а):
И еще вопрос:
Имеет ли смысл отсылать такие заголовки как:
Accept-Language
Accept-Encoding
Accept-Charset
Connection

И для меня немного непонятен вопрос взаимодействия с куками? Кто-то может мне дать разъяснения по этому вопросу? Мне нужно их HttpFox'ом высматривать и потделывать?

Спустя 6 минут, 42 секунды (20.12.2011 - 16:02) killer8080 написал(а):
Цитата (print_f @ 20.12.2011 - 14:55)
И еще вопрос:
Имеет ли смысл отсылать такие заголовки как:
Accept-Language
Accept-Encoding
Accept-Charset
Connection

хуже не будет
Цитата (print_f @ 20.12.2011 - 14:55)
И для меня немного непонятен вопрос взаимодействия с куками?

curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);


Спустя 5 минут, 46 секунд (20.12.2011 - 16:07) print_f написал(а):
Хм.. как ни странно, но с
 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

я получаю The page you requested is invalid.
Без него - капчу..

Спустя 59 минут, 26 секунд (20.12.2011 - 17:07) killer8080 написал(а):
print_f
попробовал на сокетах, вроде работает
$keyword = 'word'; 
$url = 'http://www.google.ru/search?q='.$keyword.'&num=100&filter=0&start=1';
$f = fsockopen('www.google.ru', 80, $n, $s, 5);
fwrite($f,
"GET $url HTTP/1.0\r\n".
"Host: www.google.ru\r\n".
"User-Agent: Opera/9.80 (Windows NT 6.1; U; ru)\r\n".
"Connection: Close\r\n\r\n"
);

$content = '';
while(!feof($f)){
$content .= fgets($f, 4096);
}
fclose($f);


echo $content;
//echo '<pre>'.htmlspecialchars($content).'</pre>';

Спустя 31 минута, 26 секунд (20.12.2011 - 17:38) Guest написал(а):
А так?

Свернутый текст
function get_google($search)
{
$data = file_get_contents('http://www.google.com/m/?q='.$search.'&output=wml');
$exp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";

if (preg_match_all("/$exp/siU", $data, $matches, PREG_SET_ORDER))
{
$c = count($matches);
for ($i=0; $i<$c; $i++) {
$links[] = $matches[$i][2];

}
}

return $links;
}

Спустя 53 минуты, 40 секунд (20.12.2011 - 18:32) Xes написал(а):
А вона но че..... Капча не всегда появляется.... А я то думаю.....
Цитата (print_f @ 20.12.2011 - 12:55)
И для меня немного непонятен вопрос взаимодействия с куками? Кто-то может мне дать разъяснения по этому вопросу? Мне нужно их HttpFox'ом высматривать и потделывать?

Помоему нет ты просто представишься Mazila-ой сервак те даст куки они запишутся в файл curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt"); далее они от туда браться будут.

Спустя 5 минут, 13 секунд (20.12.2011 - 18:37) print_f написал(а):
Guest
Огромное, человеческое спасибо!

Xes
и Вам спасибо! теперь ясно

Спустя 4 дня, 22 часа, 16 минут, 4 секунды (25.12.2011 - 16:53) print_f написал(а):
В продолжение темы.. что бы не открывать новую.
Не могу на концептуальном уровне решить задачу парсинга.
Для меня не оказалось проблематичным выпарсить что угодно от куда угодно.. при условии что я знаю от куда буду парсить.
Но что делать если структура ДОМа изначально неизвестна? Я не имею представления что вернет гугль моему парсеру, какие это будут страницы и как мне собрать универсальный парсер для выборки больших текстов (2к символов и выше).
Я не прошу дать готовое решение, если есть у кого-то опыт разработки подобного, хотелось бы получить совет в какую сторону рыть вообще.

Спустя 6 минут, 28 секунд (25.12.2011 - 17:00) Игорь_Vasinsky написал(а):
это не реально.

Спустя 17 минут, 52 секунды (25.12.2011 - 17:17) print_f написал(а):
Игорь_Vasinsky
Начальство таких ответов не принимает.
Я вот подумал, что если искать в полученой строке именно то слово, по которому запрашивал гугла, и исходя из этого искать отрывающий и закрывающий тег содержащий этот текст. Если ближайшие теги окашутся параграфами, на пример, можно искать регуляркой дальше, пока не упрусь в какой нибудь див, скажем.. Но таких блоков может быть очень и очень много, да и сама статья, к примеру, может быть разбита на блоки, и тогда я не получу ее целиком.. Не может быть что бы небыло решения.. Я отказываюсь в это верить..

Спустя 1 час, 6 минут, 12 секунд (25.12.2011 - 18:24) Игорь_Vasinsky написал(а):
biggrin.gif тебе нужно знать в каком Дом-элементе содержиться контент, там может быть и дивы и другие теги. так что - это не реально.

Спустя 3 месяца, 14 дней, 21 час, 7 минут, 4 секунды (10.04.2012 - 15:31) Sliper написал(а):
Обычная структура if else тут как раз и работает, если в результате выдачи гугла нашли это то делаем то, и наоборот, просто паследовательно, а вариантов гугль выдает не много- ошибку, ничего не найдено капчу и собственно результат поиска- се просто в общем...

Спустя 5 часов, 21 минута, 48 секунд (10.04.2012 - 20:53) walerus написал(а):
Sliper - Вы не поняли суть вопроса ТС.
Игорь_Vasinsky +1, не реально написать универсальный парсер, блоки( теги ), могут быть и не закрытими, и пустыми и разными вообще и частными в том числе. Только писать "фильтры" для каждого вида


_____________
Быдлоскрипт — это скрипт, сделанный быдлокодером «с душою», либо злым кодером с жуткими умыслами.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.