Как улучшить Scraping изображений (используя PHP и JS) для имитации Facebook Previewer - PullRequest
3 голосов
/ 14 марта 2011

Я разработал механизм очистки изображений в PHP + JS , который позволяет пользователю обмениваться URL-адресами и получать предварительный просмотр (очень похоже на предварительный просмотр Facebook, когда вы делитесь ссылками). Тем не менее, весь процесс иногда замедляется или иногда получает неправильные изображения, поэтому в целом Я хотел бы знать, как его улучшить, особенно его скорость и точность . Такие вещи, как анализ DOM быстрее или получение размеров изображения быстрее. Вот процесс, который я использую, для тех, кто хочет знать больше:

A. Получить HTML-код страницы с помощью PHP (на самом деле я использую один из классов CakePHP , которые, в свою очередь, используют fwrite и fread для извлечения HTML-кода. Интересно, будет ли cURL значительно лучше).

B. Анализируйте HTML, используя DOMDocument , чтобы получить теги img, а также отфильтровывайте любое «изображение», которое не является png, jpg или gif (вы знаете, иногда люди помещают скрипты отслеживания в теги img). 1015 *

$DOM = new DOMDocument();  
@$DOM->loadHTML($html); //$html here is a string returned from step A  
$images = $DOM->getElementsByTagName('img');  
$imagesSRCs = array();  
foreach ($images as $image) {  
    $src = trim($image->getAttribute('src'));  
    if (!preg_match('/\.(jpeg|jpg|png|gif)/', $src)) {  
        continue;  
    }  
    $src = urldecode($src);  
    $src = url_to_absolute($url, $src); //custom function; $url is the link shared  
    $imagesSRCs[] = $src;  
}  
$imagesSRCs = array_unique($imagesSRCs); // eliminates copies of a same image

C. Отправьте массив со всеми этими тегами изображений на страницу, которая обрабатывается с использованием Javascript (в частности, JQuery). Эта обработка в основном состоит в отбрасывании изображений размером менее 80 пикселей (поэтому я не получаю пустых картинок, сотни крошечных значков и т. Д.). Поскольку он должен рассчитывать каждый размер изображения, я решил использовать JS вместо PHP getimagesize(), потому что он был безумно медленным. Таким образом, когда изображения загружаются браузером, он выполняет следующие действия:

$('.fetchedThumb').load(function() {  
    $smallestDim = Math.min(this.width, this.height);  
    if ($smallestDim < 80) {  
        $(this).parent().parent().remove(); //removes container divs and below  
    }  
});

Ответы [ 2 ]

0 голосов
/ 31 марта 2012

Именно поэтому я сделал jQueryScrape

Это очень легкий плагин jQuery + PHP-прокси, который позволяет асинхронно чистить удаленные страницы, и он работает очень быстро. Демонстрация, которую я привел выше, распространяется примерно на 8 различных сайтов и загружает тонны контента, обычно менее чем за 2 секунды.

Самым большим узким местом при работе с PHP является то, что PHP будет пытаться загрузить весь ссылочный контент (то есть изображения), как только вы попытаетесь проанализировать что-либо на стороне сервера. Чтобы избежать этого, прокси в jQueryScrape фактически разбивает теги изображений на сервере перед отправкой его клиенту (изменяя все теги img на теги span).

Плагин jQuery предоставляет метод span2img, который преобразует эти теги span обратно в изображения, поэтому загрузка изображений остается на усмотрение браузера и происходит при визуализации контента. В этот момент вы можете использовать результат в качестве обычного объекта jQuery для анализа и визуализации выборок удаленного контента. См. Страницу github для базового использования.

0 голосов
/ 15 марта 2011

Вместо того, чтобы загружать контент, подобный этому, почему бы не создать серверный компонент, который использует что-то вроде wkhtmltoimage или PhantomJS для визуализации изображения страницы, а затем просто уменьшите изображение до размера предварительного просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...