Парсер иконок

A
На сайте с 03.04.2011
Offline
12
1610

Как спарсить иконку сайта?

Задача.

Есть в БД набор адресов сайтов. Надо перейти по ним и скопировать иконку на свой сервак в папочку favicons/id_site.file_ext

id_site.file_ext храним в бд как путь к файлу.

Дано:

На каждом сайте должна быть указана ( но может быть и не указана) строчка.

<link {href может находится и тут} rel="shortcut icon" {и тут} type="image/x-icon" href="http://www.tgc6.ru/fileadmin/template/images/Favicon.png">

Может href быть и без http а просто /favicon.ico и все. Тут надо будет подставить урку без заднего слеша в начало строки.

Помогите написать хоть регулярку для извлечения адреса или href.

Компании РФ. Aqula.ru - Социальная сеть инвесторов (http://www.aqula.ru/blogs/). Новый IR проект.
[Удален]
#1
P
На сайте с 28.04.2011
Offline
1
#2

например как-то так:


<?php
function get($url) {
$ch = curl_init($url);
curl_setopt_array($ch, array(
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true
# прочие параметры плюс обработка 30x ответов, если включена open_basedir, и нужно ходить по редиректам
));

if (!($res = curl_exec($ch))) {
curl_close($ch);
throw new Exception(sprintf("%s", @curl_error($ch)));
}

curl_close($ch);

return $res;
}

$urls = array_map('trim', file($argv[1]));
foreach ($urls as $url) {
echo "Crawling [$url]: ";
$favicon_url = sprintf('%s/favicon.ico', $url); # default
$host = parse_url($favicon_url, PHP_URL_HOST);

try {
$page = get($url);
if (preg_match('#(<link.*image/x-icon\W.*>)#Ui', $page, $m)) {
if (preg_match('#href=(.+)\s#Ui', $m[1], $m)) {
$raw_favicon_url = trim(str_replace(array('\'', '"'), '', $m[1])); # удаляем кавычки
if (strpos($raw_favicon_url, 'http://') === 0) {
$favicon_url = $raw_favicon_url;
} else {
$favicon_url = sprintf('http://%s/favicon.ico', $host, $raw_favicon_url);
}
}
}

file_put_contents($argv[2] . "/$host.ico", get($favicon_url));

echo "[OK]\n";

} catch (Exception $e) {
printf("Got error while processing: %s\n", $e->getMessage());
continue;
}

}
?>

запускать так php script.php domain.txt favicon_dir

содержимое domains.txt:


http://google.ru/
http://yandex.ru
http://unexisteeeeddomain.com
http://mail.ru/
https://searchengines.guru/

это демка в общих чертах, спайдер и директории переделываются под твой случай, так же, если парсить нужно не только favicon, то имхо, лучше использовать DOM, вместо регулярок

A
На сайте с 03.04.2011
Offline
12
#3
psishock:
например как-то так:

<?php
function get($url) {
$ch = curl_init($url);
curl_setopt_array($ch, array(
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true
# прочие параметры плюс обработка 30x ответов, если включена open_basedir, и нужно ходить по редиректам
));

if (!($res = curl_exec($ch))) {
curl_close($ch);
throw new Exception(sprintf("%s", @curl_error($ch)));
}

curl_close($ch);

return $res;
}

$urls = array_map('trim', file($argv[1]));
foreach ($urls as $url) {
echo "Crawling [$url]: ";
$favicon_url = sprintf('%s/favicon.ico', $url); # default
$host = parse_url($favicon_url, PHP_URL_HOST);

try {
$page = get($url);
if (preg_match('#(<link.*image/x-icon\W.*>)#Ui', $page, $m)) {
if (preg_match('#href=(.+)\s#Ui', $m[1], $m)) {
$raw_favicon_url = trim(str_replace(array('\'', '"'), '', $m[1])); # удаляем кавычки
if (strpos($raw_favicon_url, 'http://') === 0) {
$favicon_url = $raw_favicon_url;
} else {
$favicon_url = sprintf('http://%s/favicon.ico', $host, $raw_favicon_url);
}
}
}

file_put_contents($argv[2] . "/$host.ico", get($favicon_url));

echo "[OK]\n";

} catch (Exception $e) {
printf("Got error while processing: %s\n", $e->getMessage());
continue;
}

}
?>


запускать так php script.php domain.txt favicon_dir

содержимое domains.txt:

http://google.ru/
http://yandex.ru
http://unexisteeeeddomain.com
http://mail.ru/
https://searchengines.guru/


это демка в общих чертах, спайдер и директории переделываются под твой случай, так же, если парсить нужно не только favicon, то имхо, лучше использовать DOM, вместо регулярок

Спасибо тебе огромное.

я тоже смотрел в сторону курлов.

А если иконка в .png будет как в примере выше. А мы ее в .ico запишем

file_put_contents($argv[2] . "/$host.ico", get($favicon_url));

Это нормально будет? Проканает? Или надо и расширение выделять и сохранять?

P
На сайте с 28.04.2011
Offline
1
#4

ну как вариант:


try {
$page = get($url);
if (preg_match('#(<link.*rel=.*icon\W.*>)#Ui', $page, $m)) {
if (preg_match('#href=(.+)\s#Ui', $m[1], $m)) {
$raw_favicon_url = trim(str_replace(array('\'', '"'), '', $m[1])); # удаляем кавычки
if (strpos($raw_favicon_url, 'http://') === 0) {
$favicon_url = $raw_favicon_url;
} else {
$favicon_url = sprintf('http://%s/%s', $host, $raw_favicon_url);
}
}
}

$favicon_name = $host;
$favicon_ext = 'ico'; # default ext
if (preg_match('/\.(\w+)\W*$/U', $favicon_url, $ext)) { # i.e main.ru's favicon etc
$favicon_ext = $ext[1];
}
file_put_contents($argv[2] . "/$favicon_name.$favicon_ext", get($favicon_url));

echo "[OK]\n";

} catch (Exception $e) {
printf("Got error while processing: %s\n", $e->getMessage());
continue;
}

но для определения какой-нибудь экзотики, типа тач айконов в айпадах и т.д. не помешает так же и анализировать content-type при запросе иконки по выделенному урлу (там может быть просто что-то типа <link ... href="/screen-type-favicon.php"). Здесь просто общий случай с регулярками.

A
На сайте с 03.04.2011
Offline
12
#5
psishock:
ну как вариант:
но для определения какой-нибудь экзотики, типа тач айконов в айпадах и т.д. не помешает так же и анализировать content-type при запросе иконки по выделенному урлу (там может быть просто что-то типа <link ... href="/screen-type-favicon.php"). Здесь просто общий случай с регулярками.

Хмм...не сталкивался с тач айконами в нете. А вдруг за ними будущее? Анализ в каком месте кода лучше делать?

И еще нашел несколько волшебных сайтов. Фавиконовских линков не видно на них. Хотя иконка на месте. Видно в стилях как-то спрятали. (i.e mmk.ru's favicon)

Я ничего не придумал кроме как такого

    try { 

$page = get($url);
if (preg_match('#(<link.*icon\W.*?>)#Ui', $page, $m)) {
if (preg_match('#href=(.+)\s#Ui', $m[1], $m)) {
$raw_favicon_url = trim(str_replace(array('\'', '"'), '', $m[1])); # удаляем кавычки
if (strpos($raw_favicon_url, 'http://') === 0) {
$favicon_url = $raw_favicon_url;
} else {
$favicon_url = sprintf('http://%s/%s', $host, $raw_favicon_url);
}
}
} else {
$favicon_url = "http://www.google.com/s2/favicons?domain='.$host.'"; # для дюже спрятанных
}
# проверочка на картинность
$page = get($favicon_url);
if (preg_match("#Content-Type: ([^\"';\s]+);?#is", $page, $m)) {
if (preg_match('#image(.+)\s#Ui', $m[1], $m)) {
echo "картинка";
}else{echo "неведомы зверушки";}
}

Так али как?

arkadiy_a
На сайте с 11.06.2008
Offline
82
#6

Изменить условие задачи и парсить http://favicon.yandex.net/favicon/forum.searchengines.ru плохо подходит?

A
На сайте с 03.04.2011
Offline
12
#7
arkadiy_a:
Изменить условие задачи и парсить http://favicon.yandex.net/favicon/forum.searchengines.ru плохо подходит?

Как не странно, не все фавиконы индексируются поиковиками. Поэтому лучше их забрать у первоисточника, а если их там нет то можно подсмотреть у яши или гоши.

Только что, для интереса проверил, яндексом проиндексированно больше иконок в рунете, чем Гуглом.

Сравнил

http://favicon.yandex.net/favicon/'.$host.'

с

http://www.google.com/s2/favicons?domain='.$host.'

A
На сайте с 03.04.2011
Offline
12
#8

А как лучше удалить первый слеш в url

htef="/favicon.gif"

так как многие не указывают его почему-то.

P
На сайте с 28.04.2011
Offline
1
#9

ну полный урл на иконку здесь строится


if (strpos($raw_favicon_url, 'http://') === 0) {
$favicon_url = $raw_favicon_url;
} else {
$favicon_url = sprintf('http://%s/%s', $host, $raw_favicon_url);
}

поскольку кУРЛу не важно есть ли два слэша в части пути урла, то что бы не нагромождать лишними проверками, явно эта ситуация не обрабатывается.

Если нужно просто получать относительный путь, то например как-то так


<?php
$rel_url = '/favicon.ico';

if (strpos($rel_url, '/') === 0) {
$rel_url = substr($rel_url, 1);
}
?>
A
На сайте с 03.04.2011
Offline
12
#10

Спасибо.

Не могу определить расширение удаленного файла картинки по адресу

$favicon_ur l= "http://favicon.yandex.ru/favicon/".$host;

Как можно это сделать?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий