Xwab
Форумыnavigate_nextСкрипты

написание парсера
Сообщения
Pechk1n

помогите сделать парсер
нужно:
1.возможность качать заданный тип файлов,а точнее надо чтоб качал zip
2. Выбор папки для сохранения.
Сам пробывал сделать скачивает файлы они все делаются по 16кб и не открываются.зарание спасибо

10 Дек 2010, 17:37
ofroke

copy('http://file.ru/file.zip', 'dir/save.zip');

10 Дек 2010, 18:23
Rior

Может это страницы? в размере 16kb

10 Дек 2010, 18:23
Pechk1n

ofroke, ну это копирование одного файла с определенным именем а если нужно скопировать 20 файлов или еще больше. вообщем нужно копирование допустим с папки dowloads файлов с разрешением .zip

10 Дек 2010, 19:00
LooK

Циклы юзай, тебе готовый код никто не напишит

10 Дек 2010, 19:01
Pechk1n

Millennium, ну я хз ну имя как должно быть токо не открывается(((

10 Дек 2010, 19:03
Pechk1n

LooK, ну я просто не могу понять как копирование произвести. нашел токо копирование по полной ссылке а вот как сделать чтобы копировал без полного имени я не знаю. а так я и не просил весь код просто если у кого есть возможность и знания тот может и помочь

10 Дек 2010, 19:12
Pechk1n

вот посмотрите в чем проблема почему так сохраняет.
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Site Parser</title>
<script>
var xmlHttp = false;

function start(){
//"включаем" картинку загрузки
document.getElementById('progressbar').innerHTML = '<img src="/images/ajax-loader.gif" border="0" alt="Loading, please wait..." />';
//инициализация ajax
try{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch (e2) {
xmlHttp = false;
}
}
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
//открываем страницу parser.php
xmlHttp.open("POST", 'parser.php', true);
//Устанавливаем заголовок - говорим, что это форма
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//задаём функцию-обработчик результата
xmlHttp.onreadystatechange = parseResult;
//отправляем запрос
xmlHttp.send('url='+document.getElementById('url').value+'&types='+document.getElementById('types').value+'&max='+document.getElementById('max').value);
}

function parseResult(){
//функция-обработчик: если состояние = 4 ("полностью загружено"), то вставляем результат работы скрипта вместо картинки
xmlHttp.onreadystatechange = function(){
if (xmlHttp.readyState==4){
document.getElementById('progressbar').innerHTML = 'Завершено.<br />'+xmlHttp.responseText;
}
}
}

</script>
<style>
/* Немного украшательств */
td{
font-family: Tahoma;
font-size: 11pt;
color: #185;
text-align: left;
}
</style>
</head>
<body>
<center>
<div id="progressbar"></div>
<!-- Кстати, форму можно не делать, т.к. при отправке мы обращаемся к инпутам с помощью getElementById и отправляем с помощью аякс -->
<table>
<tr>
<td>Адрес начальной страницы:</td>
<td><input type="text" size="40" id="url" value="http://сайт.ru/downloads/" /></td>
</tr>
<tr>
<td>Типы файлов:</td>
<td><input type="text" size="10" id="types" value="zip" /></td>
</tr>
<tr>
<td>Максимальное количество файлов</td>
<td><input type="text" size="5" id="max" value="0" /></td>
</tr>
<tr>
<td colspan="2"><input type="button" value="Начать" onclick="start()" /></td>
</tr>
</table>
</center>
</body>
</html>

10 Дек 2010, 21:30
Pechk1n

parser

<?PHP
//Ставим время выполнения 10 минут
ini_set('max_execution_time', 600);
//замеряем время начала работы скрипта
$st_time = microtime(true);

//устанавливаем переменные...
$url = $_POST['url'];
$types = $_POST['types'];
$maxPages = (int)$_POST['max'];
$host = explode('/', substr($url, 7));
$host = substr($url, 0, 7).$host[0].'/';
//про последние 2 строчки подробней: таким вот образом получаем Адрес сайта (на случай, если ввели
//адрес странички сайта) - разбиваем на массив по слешу и берём первую часть...

//для удобства работы с КУРЛом, напишем простенькую функцию
//параметры: $host - адрес, $referer - откуда пришли (можно подделать, в статистике парсимого сайта будет отображаться, что мы пришли, например, с Яндекса
//$file - идентификатор файла (если мы хотим скачать файл, то передаём его идентификатор)
function curl_get($host, $referer = null, $file = null){
//инициализация curl и задание основных параметров
$ch = curl_init($host);
curl_setopt($ch, CURLOPT_USERAGENT, 'Site Parser');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_REFERER, $referer);
//если дали ссылку на файл
if (!is_null($file)){
//то устанавливаем опцию записи в файл,
curl_setopt($ch, CURLOPT_FILE, $file);
//и выполняем
curl_exec($ch);
//не забываем закрыть соединение
curl_close($ch);
}else{
//если же ссылку на файл не дали, то возвращаем страничку
ob_start();
curl_exec($ch);
print(curl_error($ch));
curl_close($ch);
return ob_get_clean();
}
}
//получаем html-код исходной страницы
$page = curl_get($url);
//регулярным выражением ищем вхождение ссылок
preg_match_all('#href="([A-z0-9.-]+)"#', $page, $matches);
//получаем массив всех-всех ссылок с этой старницы
$links = $matches[1];
$cnt = 0;
//цикл: пока не прошли весь массив ссылок, либо пока не скачали макс. количество файлов (не действет в случае 0)
for($i=0; ($i<sizeof($links)&&($cnt<$maxPages||$maxPages==0)); $i++){
//если в ссылке есть нужное нам расширение
if (strpos($links[$i], $types)!==false){
//то открываем файл, "курлим" в него содержимое файла на сервере, закрываем, увеличиваем счётчик
$fp = fopen($links[$i], 'w');
curl_get($host.$links[$i], $url, $fp);
fclose($fp);
$cnt++;
}else{
//иначе это ещё одна ссылка, перейдём по ней, найдём все ссылки и занесём их в массив
$page = curl_get($links[$i], $url);
preg_match_all('#href="([A-z0-9.-]+)"#', $page, $matches);
$links = array_merge($links, $matches[1]);
}
}
//замеряем время окончания работы и выводим...
$en_time = microtime(true);
print 'Скачано файлов: '.$cnt.'<br />Время выполнения: '.($en_time-$st_time);
?>

10 Дек 2010, 21:31
mikoda

хм, а где писать свой сайт, и донора. ?

04 Апр 2011, 14:57
Ответить на тему