Posts Tagged ‘ curl

Curl vs sockets vs file_get_contents vs multiCurl

Давайте же проведем небольшое сравнение в скорости.

1) Curl

< ?
function curl($url)
{
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close($ch);
return $result;
}

2) Sockets

function sockets($host) {
$fp = fsockopen("www.".$host, 80, $errno, $errstr, 30);
  $out = "GET / HTTP/1.1\r\n";
  $out .= "Host: www.".$host."\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $out);
  $f='';
  while (!feof($fp)) {
    $f .= fgets($fp, 1024);
  }
return $f;
}

3) file_get_contents

function fgc($url){
return file_get_contents($url);
}

4) MultiCurl

function multiRequest($data,$nobody=false,$options = array(), $oneoptions = array())
{
	$curls = array();
	$result = array();
	$mh = curl_multi_init();
	foreach ($data as $id => $d)
	{
		$curls[$id] = curl_init();
		$url = (is_array($d) &amp;&amp; !empty($d['url'])) ? $d['url'] : $d;
		curl_setopt($curls[$id], CURLOPT_URL,            $url);
		curl_setopt($curls[$id], CURLOPT_HEADER,         0);
		curl_setopt($curls[$id], CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curls[$id], CURLOPT_FOLLOWLOCATION,1);
		curl_setopt($curls[$id], CURLOPT_USERAGENT,"Mozilla/5.0(Windows;U;WindowsNT5.1;ru;rv:1.9.0.4)Gecko/2008102920AdCentriaIM/1.7Firefox/3.0.4");
		//curl_setopt($curls[$id], CURLOPT_COOKIEJAR,'cookies.txt');
		//curl_setopt($curls[$id], CURLOPT_COOKIEFILE,'cookies.txt');
		//curl_setopt($curls[$id], CURLOPT_NOBODY, $nobody);

		if (!empty($options))
		{
			curl_setopt_array($curls[$id], $options);
		}
		if (!empty($oneoptions[$id]))
		{
			curl_setopt_array($curls[$id], $oneoptions[$id]);
		}
		if (is_array($d))
		{
			if (!empty($d['post']))
			{

				curl_setopt($curls[$id], CURLOPT_POST,       1);
				curl_setopt($curls[$id], CURLOPT_POSTFIELDS, $d['post']);
			}
		}
		curl_multi_add_handle($mh, $curls[$id]);
	}
	$running = null;
	do
	{
		curl_multi_exec($mh, $running);
	}
	while($running > 0);
	foreach($curls as $id => $content)
	{
		$result[$id] = curl_multi_getcontent($content);
		//echo curl_multi_getcontent($content);
		curl_multi_remove_handle($mh, $content);
	}
	curl_multi_close($mh);
	return $result;
}

В качестве теста получим страницу "http://google.de" сто раз.

$url = 'google.de';
$start = microtime(1);
for($i=0;$i&lt;100;$i++)
curl($url);
$end = microtime(1);
echo "Curl:".($end-$start)."\n";

$start = microtime(1);
for($i=0;$i&lt;100;$i++)
fgc("http://$url/");
$end = microtime(1);
echo "file_get_contents:".($end-$start)."\n";

$start = microtime(1);
for($i=0;$i&lt;100;$i++)
sockets($url);
$end = microtime(1);
echo "Sockets:".($end-$start)."\n";

$start = microtime(1);
for($i=0;$i&lt;100;$i++)
$arr[]=$url;
multiRequest($arr);
$end = microtime(1);
echo "MultiCurl:".($end-$start)."\n";
?>

Результаты:

Curl: 5.39667105675
file_get_contents: 7.99799394608
Sockets: 2.99629592896
MultiCurl: 0.736907958984

Как видим, лидирует мультикурл, беспощадно оставляя своих соперником далеко позади. Применять multicurl стоит лишь тогда, когда имеется объемное количество url'ов.
Иначе, если список "страниц", которые необходимо "посетить" небольшой(2,3,5,10), самый рациональный вариант - использовать сокеты, но..кому как, мне например, несмотря на то, что т socket'ы выигрывают у curl'а, удобнее использовать его, т.к нет проблем с заголовками(headers) и прочим.

Что выбрать? Решать только вам.

Anticaptcha balance checker

Набросал простенький скриптик на bash для чека баланса антикапчи с использованием curl/wget.

#!/bin/bash
login="your_login_here"
pword="your_password_here"
post_string="login=${login}&amp;password=${pword}"
url="http://antigate.com/panel.php"

which curl > /dev/null
if [ $? -eq 0 ]; then
        #echo "Using curl..."
        GET_CMD="curl -sd "
else
which wget > /dev/null
   if [ $? -eq 0 ]; then
                #echo "Using wget..."
                GET_CMD="wget -q -O - --post-data "
        else
                echo "Could not find wget or curl"
                exit 2
        fi
fi
respone=`${GET_CMD} ${post_string} ${url}|  sed -n -e 's/.*<span class=\"hlinks\">\(.*\)<\/span>.*/\1/p'`
echo "Ваш баланс: ${respone}"

или однострочный вариант:

curl -sd "login=your_login_here&amp;password=your_password_here" http://antigate.com/panel.php |  sed -n -e 's/.*<span class=\"hlinks\">\(.*\)<\/span>.*/\1/p'

Kinopoisk.ru Parser

kinopoisk
Недавно мой знакомый (журналист на новостном портале) попросил меня "накатать" небольшой скриптик, для упрощения рутиной работы (копипастинг данных и оборачивание в BB-code).
Парсит нижеприведенный список значений:
1)Назывние
2)Оригинальное название
3)Год
4)Страна
5)Слоган
6)Режиссер
7)Сценарий
8)Продюсер
9)Оператор
10)Композитор
11)Жанр
12)Бюджет
13)Сборы в США
14)Сборы в мире
15)Сборы в России
16)Премьера (мир)
17)Премьера (РФ)
18)Релиз на DVD
19)Релиз на Blu-Ray
20)Рейтинг MPAA
21)Время
22)Описание
23)Рейтинг Кинопоиск
24)Рейтинг IMDb
25)Картинка(логотип фильма)
26)Ссылку на трейлер
27)Картинку к трейлеру
Парсер съедает ссылки вида:  http://www.kinopoisk.ru/level/1/film/251733/ и просто ID фильма: 251733

Авторизация необходима для обхода бана.

Код:

<form method='get'>
<input type='text' name='id' value='<?php echo $m[0];?>' size="40">
<input type='submit' value='get' name='submit'>
</form>
<?
#################################
# Kinopoisk.ru parser
# by #Wolf#
# http://wolf-et.ru/
#################################
if(empty($_REQUEST['id'])){die("die");}
//header ("Content-type: text/html; charset=utf-8");
$user='login';
$password='password';
   function post($url,$post,$refer)
	{
	if($post==null){$post=false;}
       $ch = curl_init($url);
       curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4");
       curl_setopt($ch, CURLOPT_HEADER, 0);
       curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
       curl_setopt($ch, CURLOPT_REFERER, $refer);
       curl_setopt($ch, CURLOPT_COOKIEJAR, "./cookie.txt");
       curl_setopt($ch, CURLOPT_COOKIEFILE, "./cookie.txt");
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       $result  = curl_exec($ch);
	   return $result;
	}
	preg_match('#([0-9]{2,7})#',$_REQUEST['id'],$m);
	post('http://www.kinopoisk.ru/level/30/','shop_user[login]='.$user.'&shop_user[pass]='.$password.'&shop_user[mem]=on&auth=%E2%EE%E9%F2%E8+%ED%E0+%F1%E0%E9%F2','http://www.kinopoisk.ru');
	$result=post('http://www.kinopoisk.ru/level/1/film/'.$m[0].'/',null,'http://www.kinopoisk.ru/');
    $result= iconv("cp1251", "utf8", $result);
	//echo $result;
	$parse=array(
	'name' =>         '#<h1 style=\"margin: 0; padding: 0\" class="moviename-big">(.*?)</h1>#si',
	'originalname'=>  '#13px">(.*?)</span>#si',
	'year' =>         '#год</td><td class=\"\">(.*?)</td></tr>#si',
	'country' =>      '#страна</td><td class=\"\">(.*?)</td></tr>#si',
	'slogan' =>       '#слоган</td><td style="color: \#555">(.*?)</td></tr>#si',
	'director' =>     '#режиссер</td><td>(.*?)</td></tr>#si',
	'script' =>       '#сценарий</td><td>(.*?)</td></tr>#si',
	'producer' =>     '#продюсер</td><td>(.*?)</td></tr>#si',
	'operator' =>     '#оператор</td><td>(.*?)</td></tr>#si',
	'composer' =>     '#композитор</td><td>(.*?)</td></tr>#si',
	'genre' =>        '#жанр</td><td>(.*?)</td></tr>#si',
	'budget' =>       '#бюджет</td><td class=\"dollar\">(.*?)</td></tr>#si',
	'usa_charges' =>  '#США</td><td class=\"dollar\">(.*?)</td></tr>#si',
	'world_charges'=> '#мире</td><td class=\"dollar\">(.*?)</td></tr>#si',
	'rus_charges' =>  '#России</td><td class=\"dollar\">(.*?)</td></tr>#si',
	'world_premiere'=>'#мир\)</td><td class=\"calendar\">(.*?)</td></tr>#si',
	'rus_premiere' => '#РФ\)</td><td class="calendar">(.*?)</td></tr>#si',
	'dvd' =>          '#dvd">(.*?)</td></tr>#is',
	'bluray' =>       '#bluray">(.*?)</td></tr>#is',
	'MPAA' =>         '#MPAA</td><td class=\"[\S]{1,100}\"><a href=\'[\S]{1,100}\'><img src=\'/[\S]{1,100}\' height=11 alt=\'(.*?)\' border=0#si',
	'time' =>         '#id="runtime">(.*?)</td></tr>#si',
	'description' =>  '#<span class=\"_reachbanner_\">(.*?)</span>#si',
	'imdb' =>         '#IMDB:\s(.*?)</div>#si',
	'kinopoisk' =>    '#text-decoration: none">(.*?)<span#si',
	'kp_votes' =>     '#<span style=\"font:100 14px tahoma, verdana\">(.*?)</span>#si',
	 );

   $new=array();
   foreach($parse as $index => $value)
   {
   preg_match($value,$result,$matches);
   $new[$index]=preg_replace("#<a.+?>(.+?)</a>#is","$1",$matches[1]);
   }
preg_match('#getTrailer\("(.*?)","(.*?)","(.*?)","[0-9]+","[0-9]+","(.*?)",""\);#i',$result,$trailer);
  /////////////////////////print//////////////////////////////
echo '[img]http://www.kinopoisk.ru/images/film/'.$m[0].'.jpg[/img]<br />';
echo '[Ссылка на трейлер] http://'.$trailer[4].'.kinopoisk.ru/trailers/flv/'.$trailer[2].'<br />';
echo '[Трейлер preview] http://'.$trailer[4].'.kinopoisk.ru/trailers/flv/'.$trailer[3].'<br />';
echo '[b]Назывние:[/b]'.$new['name'].'<br />';
echo '[b]Оригинальное название:[/b]'.$new['originalname'].'<br />';
echo '[b]Год:[/b]'.$new['year'].'<br />';
echo '[b]Страна:[/b]'.$new['country'].'<br />';
echo '[b]Слоган:[/b]'.$new['slogan'].'<br />';
echo '[b]Режиссер:[/b]'.$new['director'].'<br />';
echo '[b]Сценарий:[/b]'.$new['script'].'<br />';
echo '[b]Продюсер:[/b]'.$new['producer'].'<br />';
echo '[b]Оператор:[/b]'.$new['operator'].'<br />';
echo '[b]Композитор:[/b]'.$new['composer'].'<br />';
echo '[b]Жанр:[/b]'.$new['genre'].'<br />';
echo '[b]Бюджет:[/b]'.$new['budget'].'<br />';
echo '[b]Сборы в США:[/b]'.$new['usa_charges'].'<br />';
echo '[b]Сборы в мире:[/b]'.$new['world_charges'].'<br />';
echo '[b]Сборы в России:[/b]'.$new['rus_charges'].'<br />';
echo '[b]Премьера (мир):[/b]'.$new['world_premiere'].'<br />';
echo '[b]Премьера (РФ):[/b]'.$new['rus_premiere'].'<br />';
echo '[b]Релиз на DVD:[/b]'.$new['dvd'].'<br />';
echo '[b]Релиз на Blu-Ray:[/b]'.$new['bluray'].'<br />';
echo '[b]Рейтинг MPAA:[/b]'.$new['MPAA'].'<br />';
echo '[b]Время:[/b]'.$new['time'].'<br />';
echo '[b]Описание:[/b]'.$new['description'].'<br />';
echo '[b]Рейтинг Кинопоиск:[/b]'.$new['kinopoisk'].'('.$new['kp_votes'].' )<br />';
echo '[b]Рейтинг IMDb:[/b]'.$new['imdb'].'<br />';
?>
 
http://wolf-et.ru/wp-admin/page/library/