hace unos dias pedi consejo acerca de hacer web scraping a una web y para ello necesitaba de varios proxies. pues bien, me gustaria compartir este codigo que supongo que a algunos les ayudara.
es un script en php que recopila la lista de proxies de la web de hidemyass. esta probado y funciona perfectamente (al menos hace 2 semanas, si no han cambiado el formato de hidemyass deberia funcionar). la lista la carga en una base de datos de mysql, en la que crea una tabla de nombre el dia y mes actual, con los siguientes campos: id, address (ip:port), type (http, https, socks4/5) y used (la cantidad de veces que se ha usado). ademas, actualiza un fichero de texto con el nombre de la tabla actualizada. tan solo habria que rellenar los datos del apartado 'DATA' y correrlo. el codigo es el siguiente:
Código
<?php //// includes include('./simple_html_dom.php'); /************ DATA ************/ $num_pages=10; // 50 proxies/page $speed_limit=50; // min speed to take proxy $conn_limit=50; // min connection time to take proxy $sleep_time=3; // seconds to wait between different pages // data for mysql $server='localhost'; $user='foo'; $pass='bar'; $db_name='example'; /************ MAIN ************/ for ($i=1; $i<=$num_pages; $i++) { $html=file_get_html('http://www.hidemyass.com/proxy-list/'.$i); foreach ($html->find('tr') as $tr) { $speed=get_proxy_specs($tr->find('td', 4)); $connection_time=get_proxy_specs($tr->find('td', 5)); if ($speed > $speed_limit && $connection_time > $conn_limit) { $proxy_address[]=get_proxy_address($tr); $proxy_type[]=$tr->find('td', 6)->plaintext; } } } //// save data in the database $name='proxies_'.date('d_m'); // name of the new daily table is 'proxies_$d_$m', where $d=day and $m=month $table='CREATE TABLE '.$name.' (id smallint NOT NULL AUTO_INCREMENT, address VARCHAR(25) NOT NULL, type VARCHAR(10) NOT NULL, used smallint default \'0\', PRIMARY KEY (id))'; for ($i=0; $i<count($proxy_address); $i++) { $query='INSERT INTO '.$name.' (address, type) VALUES (\''.$proxy_address[$i].'\', \''.$proxy_type[$i].'\')'; } //// update file 'daily_table.txt' with the new name of daily table //// close mysql connection /************ FUNCTIONS ************/ function get_proxy_specs($td) { $html=$td->find('div', 0)->find('div', 0)->style; return $result[1]; } function get_proxy_address($tr) { // retrieve classes with the 'display:inline' css attribute $classes=get_classes($tr->find('td', 1)->find('span', 0)->find('style', 0)->xmltext); // get the piece of html with the proxy ip and make some formating to it $html=$tr->find('td', 1)->xmltext; $html=preg_replace(array('%<style>(\s+\.[_\w\-]+\{display:(none|inline)\})*\s+</style>%', '%\s%', '%"%', '%/%'), '', $html); // get the proxy ip applying some filters $ip=filter($html, $classes); // get the proxy port $port=$tr->find('td', 2)->plaintext; // return with the format 'ip:port' return $ip.':'.$port; } function get_classes($html) { foreach ($html as $element) { $classes[]=$result[1]; } } return $classes; } function filter($html, $classes) { // filter 1: class with the 'display:inline' value css attribute foreach ($html as $key=>$element) { foreach ($classes as $cl) { $pattern='class='.$cl; } } } // filter 2: class name is made only by numbers and is not in the $classes array foreach ($html as $key=>$element) { } } // filter 3: elements with the 'display:inline' css-style value attribute foreach ($html as $key=>$element) { } } // retrieve de ip address $ip=''; foreach ($html as $key=>$element) { $ip.=$result[1]; } } return $ip; } ?>
luego haria falta otro archivo que yo le he llamado 'proxy_functions.php', que contendria lo siguiente:
Código
<?php //// data $server='localhost'; $user='foo'; $pass='bar'; $db_name='example'; $used_limit=9; function get_proxy() { // read the name of the updated proxy list // connect to database // select a pseudo-random proxy that have been used $used_limit or less times $query='SELECT id, address, type FROM '.$name.' WHERE used<'.$used_limit.' ORDER BY rand() LIMIT 1'; // update the number of times the proxy has been used $query='UPDATE '.$name.' SET used=used+1 WHERE id='.$row['id']; // return the array=(address, type) } ?>
con lo que simplemente, para usar un proxy al azar en un script php, bastaria con correr en una cron job el primer script 1 vez al dia por ejemplo (o 2, o las que sean), y luego en el script en el que quieras usar el proxy hacer:
Código
<?php include('proxy_functions.php'); $proxy=get_proxy(); // $proxy['address']=a.b.c.d:p // $proxy['type']=http | https | socks4/5 ?>
y bueno, el codigo no tiene casi nada de verificacion de errores, por no decir que tiene solo 1 xD, y tampoco creo que sea el codigo mas optimo y eficiente pero funcionar funciona. por ultimo decir que quien quiera usar el codigo que lo use, asi como copiarlo, modificarlo, imprimirlo y pegarlo en la nevera, o lo que sea, pero se agradeceria que si se comparte en alguna otra web o blog, se ponga un enlace a la fuente que en este caso seria esta pagina.
un saludo!