Возникла необходимость написать парсер результатов запроса гугла.
Опыта в РНР маловато, но кое чо все таки сваял. Но, к сожалению, наткнулся на капчу.
Привожу код, если не затруднит, укажите мне на мои ошибки.
$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 цифр наверное, теоретически сам незаганялся, этим вопросом. А у меня например при обрещении к скрипту если вышла лажа капча каждый рас переписывается в сесии.
Спустя 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
Спасибо, узерагент я из виду-то и упустил.. но все равно кидает на капчу, к сожалению
капча 5-6 символов.. перебирать такую долго и нудно
killer8080
Спасибо, узерагент я из виду-то и упустил.. но все равно кидает на капчу, к сожалению
Спустя 4 минуты, 28 секунд (20.12.2011 - 15:54) killer8080 написал(а):
print_f
попробуй задействовать куки и CURLOPT_FOLLOWLOCATION
попробуй задействовать куки и CURLOPT_FOLLOWLOCATION
Спустя 1 минута, 16 секунд (20.12.2011 - 15:55) print_f написал(а):
И еще вопрос:
Имеет ли смысл отсылать такие заголовки как:
Accept-Language
Accept-Encoding
Accept-Charset
Connection
И для меня немного непонятен вопрос взаимодействия с куками? Кто-то может мне дать разъяснения по этому вопросу? Мне нужно их HttpFox'ом высматривать и потделывать?
Имеет ли смысл отсылать такие заголовки как:
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 написал(а):
Хм.. как ни странно, но с
я получаю The page you requested is invalid.
Без него - капчу..
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
и Вам спасибо! теперь ясно
Огромное, человеческое спасибо!
Xes
и Вам спасибо! теперь ясно
Спустя 4 дня, 22 часа, 16 минут, 4 секунды (25.12.2011 - 16:53) print_f написал(а):
В продолжение темы.. что бы не открывать новую.
Не могу на концептуальном уровне решить задачу парсинга.
Для меня не оказалось проблематичным выпарсить что угодно от куда угодно.. при условии что я знаю от куда буду парсить.
Но что делать если структура ДОМа изначально неизвестна? Я не имею представления что вернет гугль моему парсеру, какие это будут страницы и как мне собрать универсальный парсер для выборки больших текстов (2к символов и выше).
Я не прошу дать готовое решение, если есть у кого-то опыт разработки подобного, хотелось бы получить совет в какую сторону рыть вообще.
Не могу на концептуальном уровне решить задачу парсинга.
Для меня не оказалось проблематичным выпарсить что угодно от куда угодно.. при условии что я знаю от куда буду парсить.
Но что делать если структура ДОМа изначально неизвестна? Я не имею представления что вернет гугль моему парсеру, какие это будут страницы и как мне собрать универсальный парсер для выборки больших текстов (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 написал(а):
тебе нужно знать в каком Дом-элементе содержиться контент, там может быть и дивы и другие теги. так что - это не реально.
Спустя 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, не реально написать универсальный парсер, блоки( теги ), могут быть и не закрытими, и пустыми и разными вообще и частными в том числе. Только писать "фильтры" для каждого вида
Игорь_Vasinsky +1, не реально написать универсальный парсер, блоки( теги ), могут быть и не закрытими, и пустыми и разными вообще и частными в том числе. Только писать "фильтры" для каждого вида
_____________
Быдлоскрипт — это скрипт, сделанный быдлокодером «с душою», либо злым кодером с жуткими умыслами.