гы, не в обиду тебе ТС, но ИМХО, это не совсем так) Вод например я занимался стабильно дорвеями около 2х лет, потом бросил из-за нехватки времени, так как получил серьёзную должность в одной офшорной софтверной конторе, и вот сейчас, спустя где-то полтора года решил продолжить, даж дорген свой написал основываясь на знаниях в СЕО, полученных на протяжении того времени... и знаешь чё я тебе скажу: опыт полученный на дорах сегодня, с огромной вероятностью станет неактуальным завтра) и вот теперь, прийдётся всё по крупицам восстанавлить с СЕРПа, что бы доры хоть какой-то траф начали получать - то есть учиться делать дорвеи заново ))
раньше, с одного дора у меня было от 50 уников по моим кеям, сейчас, спустя некоторое время (С), я вообще не понимаю ЧДНТ )
ну а в чём проблема?
1. vmware локально с образом той ОС, какая на сервере или любой *nix, который знаешь лучше.
2. vmware локально с ОС и GUI, где установлена IDE под используемый тобой язык (сейчас нид никсы ГУЙов очень много на любой вкус, кроме .NET со всеми наворотами разве что)
первое сделает ненужным процесс копирования на тестовый сервак промежуточных результатов, которые ты ещё не показывешь клиенту, а тестишь сам; второе - вообще позволит не путаться в окнах, и сразу писать и тестировать в родной среде для будущего скрипта.
а svn, git etc в этом случае, имхо лишнее, если не даёшь клиенту к ним доступ. для мониторинга прогресса и прочее. Это средства контроля версий и репозитария кода для командной разработки, для просто разработки, тестирования в нэйтивной среде и минимизации окон с phpmyadmin-ом, имхо vmware достаточно )
Actions фотошопа с этим отлично справляются
фотошоп замечательно со всем справляется... ну если серверный скрипт имеется ввиду, то долго эксперементировать с ImageMagick & MagickWand до достижения максимально возможных качество/вес для вашего случая
ну полный урл на иконку здесь строится
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); } ?>
до кучи
nginx как стоит? - отдача статики поверх апача (mod_rpaf установлен?), просто FPM/Fast-CGI ?
в целом, например вот и вот
для того, что в примере, WP очень даже подойдёт
ну как вариант:
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"). Здесь просто общий случай с регулярками.
например как-то так:
<?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, вместо регулярок