Web scraper con PHP

scraper
Alguna vez te has planteado crear un programa que pueda extraer información de una web y has pensado que es un tarea realmente complicada. Vas a comprobar que es realmente sencillo poder sacar información de otra web. Empezaré con un ejemplo muy básico, después comentaré algunos framework que ayudarán al rastreo y extracción de datos y por último una aplicación que he conocido recientemente en la que puedes crearte un API con datos de una web.

Ejemplo básico

Antes que nada en este ejemplo básico vamos a usar dos funciones que son:

  1. file_get_contents: tiene como parámetro una URL y devuelve el contenido en HTML de esta. Ver documentación
  2. preg_match: sirve para encontrar coincidencias dentro de una cadena, usando expresiones regulares. Ver documentación

En el siguiente ejemplo vamos a sacar el título de mi web, que es lo que está dentro de la etiqueta <title> (en este caso es: Blog | Nicolás Marín)

$html = file_get_contents('http://www.nicolasmarin.com/');
preg_match('/<title>(.*)<\/title>/i', $html, $title);
$title_out = $title[1];

Y poco más se puede decir de este sencillo ejemplo, que sólo hace falta ponerle un poco de creatividad y sacarás cualquier elemento de una web. Leer más ›

Etiquetado con:
Publicado en: Desarrollo Web

Tweet Old Post incrementa tu tráfico desde twitter

A principio de semana descubrí un plugin fantástico para dar un poco de movimiento a los perfiles de twitter de los blogs. El problema de lograr tráfico de twitter es que el timeline es tan volátil que se tienen que alinear los astros para que tus seguidores vean tus tweets. Cuentas con más de 1000 seguidores apenas estaba recibiendo tráfico, a veces 1 o 2 visitas en un día concreto, pero ha sido poner el plugin Tweet Old Post y es una maravilla, sirve para automatizar y mover tu perfil de twitter enviando tweets con post antiguos. Este es el analytics del blog que le activé el lunes el plugin:

twitter tatuajes

Y no es que de repente haya crecido el número de seguidores, pero ahora se publica un tweet cada cuatro horas y la probabilidad de que lo vean es mayor, que si se publica un tweet o dos al día. Esto es un ejemplo para una cuenta de 1000 seguidores y para un blog de tatuajes.
Leer más ›

Etiquetado con:
Publicado en: Social Media, Wordpress

4 herramientas de estudio de competencia SEO y SEM

Es importante que conozcas a tu competencia y sepas como se lo tienen montado a nivel de motores de búsqueda, porque sacarás mucho información muy útil a la hora de afrontar tus campañas SEO y SEM. Existen varias herramientas con las que puedes hacer un seguimiento de la competencia tanto en resultados órganicos (SEO, no de pago) como de pago (SEM). Las tres primeras que paso a describir son perfectas para conocer a tu competencia y seguirles la pista aunque hay que decir que para sacarle jugo tendrás que pagar, y la cuarta no da información de competencia pero había que incluirla, porque se trata de la herramienta gratuita más conocida para saber como realizan las búsquedas tus posibles visitantes en google.

Estas son las herramientas que debes utilizar para conocer tu nicho, o para encontrar el nicho perfecto: Leer más ›

Etiquetado con: , , ,
Publicado en: SEM, SEO

MoonClerk, FastSpring, Recurly sistemas de pagos recurrentes sencillos

Si tienes un negocio en el que necesitas que tus clientes te hagan un pago de manera y no quieres complicarte mucho la vida desarrollando una pasarela de pago, es posible que esta startup MoonClerk pueda ayudarte. Se apoya en el sistema de cobro por tarjeta de crédito Stripe que se muestra como una solución económica y transparente para cobros con tarjetas de crédito. La comisión de Stripe es de 2.9% + 30 centimos de dólar por cada transferencia terminada con éxito, por lo que sólo pagas por lo que cobras. Por otro lado MoonClerk lleva asociado un gasto mensual que va desde 9$ y que va incrementando conforme aumentas tu volumen de ventas al mes. Otras ventajas de usar MoonClerk es que te crea las facturas para tus clientes, pasarela de pago amigable para una amplia gama de dispositivos, no necesitas desarrollar nada para hacerla funcionar, la pasarela puede ser personalizada para que sea igual que nuestras webs y no haya un cambio brusco cuando el cliente se diriga a la pasarela y por supuesto todo en un modo muy seguro. Uno de mis objetivos este 2013 es crear un SaaS (Software as a service) por lo que este proyecto lo tendré en cuenta a la hora de valorarlo como una posibilidad.

Otro muy interesante que cobra en cualquier moneda y hace factura en función del país de tu cliente por el tema de impuestos es FastSpring otra de las opciones por las que me estoy decantando, aunque sus comisiones son fuertes: 8.9% o 5.9% más $.95 por transacción.

Otras posibilidades que estoy barajando son el conocido PayPal aunque se lleva bastantes comisiones sobre todo si usas una moneda diferente al dólar.

Y por último Recurly, el precio es de 1,25% + 0,25$ por transacción el más bajo de todos pero pagas una tasa mensual de 69$ que para volumenes bajos es una tarifa un tanto cara, está más orientado al mercado de Estados Unidos, aunque acepta también clientes de la Unión Europea.

Si conoces otros sistemas coméntalos :) .

 

Etiquetado con: , , ,
Publicado en: Negocio Web

Subir imagenes con el API de Twitter

Este es uno de los dos tutoriales que quiero hacer de subir imágenes a las redes sociales de Twitter y Facebook. Es interesante incluir imágenes en tus tweets ya que aumenta la probabilidad de que tengan más difusión.

Para comenzar vamos a la documentación de Twitter de su API que está muy bien y vemos cúal es el método para enviar un tweet con una imagen: POST statuses/update_with_media. Si trabajas con PHP lo suyo es que te bajes la librería que te indican, para poder subir las imagenes, que es tmhOAuth.

Un ejemplo de uso de esta librería es:

require ‘../tmhOAuth.php’;
require ‘../tmhUtilities.php’;
$tmhOAuth = new tmhOAuth(array(
  ’consumer_key’ => ‘YOUR_CONSUMER_KEY’,
  ’consumer_secret’ => ‘YOUR_CONSUMER_SECRET’,
  ’user_token’ => ‘A_USER_TOKEN’,
  ’user_secret’ => ‘A_USER_SECRET’,
));
$’image = “@{$_FILES['image']['tmp_name']};type={$_FILES['image']['type']};filename={$_FILES['image']['name']}”,
$code = $tmhOAuth->request(
  ’POST’,
  ’https://upload.twitter.com/1/statuses/update_with_media.json’,
  array(
    ’media[]‘ => “@{$image}”,
    ’status’ => ‘Picture time’,
  ),
  true, // use auth
  true // multipart
);
if ($code == 200) {
  tmhUtilities::pr(json_decode($tmhOAuth->response['response']));
} else {
  tmhUtilities::pr($tmhOAuth->response['response']);
}

Y esto es todo, ahora toca lograrlo con las fanpage en Facebook

Etiquetado con: , ,
Publicado en: Desarrollo Web

Tracking de clicks con Google Analytics

La analítica web es un punto muy importante a tener en cuenta en una web, para medir su éxito. Aunque no nos vale quedarnos en valores tan básico como son las visitas y páginas vistas, que poca información podemos extraer de nuestros usuarios. En unos de los proyectos recientes que estoy colaborando y en el que vamos a introducir una característica nueva y realmente pensamos que es muy interesantes para nuestros visitantes, pero realmente como podemos saber si lo están usando o si lo usan pero se quedan a medio y no terminan el proceso y no se pueden rastrear ya que son ventanas generadas desde javascript. Por lo que necesitamos hacer un tracking de clicks por los diferentes ventanas que le mostramos para ver si siguen los pasos y sino porque no los siguen si inician el proceso.

Pues para esto vamos a usar un del atributo onClick para introducir una llamada a la función _gaq.push() que nos facilitan desde Google Analytics. Este sería un ejemplo de código:

<a onclick=”_gaq.push(['_trackEvent', 'Categoría', 'Acción', 'Información extra si deseas']);”>Enlace</a>

Un ejemplo si deseas hacer el seguimiento de las decargas de tu eBook quedaría:

<a href=”mi-ebook.pdf” onclick=”_gaq.push(['_trackEvent', 'Downloads', 'PDF', 'eBook Sidebar']);”>Enlace</a>

En el que la acción es descargas, la categoría es PDF y la información extra es que se trata del eBook que tenemos colocado en el Sidebar del blog. Hay que tener en cuenta que para proyectos con alto volumen de tráfico vamos a encontrarnos con un límite para cuentas gratuitas de analytics, que es de 10 millones de hits mensuales, para volúmenes superiores necesitas tener la cuenta Premium.

Etiquetado con: ,
Publicado en: Analítica Web

Ejecutar múltiples peticiones usando Curl paralelamente con PHP

Un escenario cada vez más común es crear una aplicación usando un popurri de APIs y queremos ofrecerle al usuario una respuesta lo más rápida posible. Si los datos que nos pide el usuario no están en local que debemos solicitarlos a varias APIs, si se hace secuencialmente se puede dar un escenario como el siguiente: en el que el API 1 tarda 2seg, API 2 3seg, API 3 3seg y API 4 8seg, suma un total de 16 segundos, con lo que el usuario se nos puede desesperarse un poco. En cambio si hacemos las peticiones simultáneamente la respuesta es posiblemente 8 segundos, lo que saldría en este escenario la mitad de tiempo, el usuario de aplicación te lo va a agraceder :) .

Este es código PHP para lograr las peticiones paralelas.

$nodes = array('http://www.api1.com', 'http://www.api2.com', 'http://www.api3.com', 'http://www.api4.com');
$node_count = count($nodes);

$curl_arr = array();
$master = curl_multi_init();

for($i = 0; $i < $node_count; $i++)
{
$url =$nodes[$i];
$curl_arr[$i] = curl_init($url); curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($master, $curl_arr[$i]); } do { curl_multi_exec($master,$running);
}

while($running > 0);

echo "results: ";
for($i = 0; $i < $node_count; $i++)
{
$results = curl_multi_getcontent ( $curl_arr[$i] );
echo( $i . "\n" . $results . "\n");
}
echo 'done';


Visto en rustyrazorblade.com y php.net

Etiquetado con: ,
Publicado en: Desarrollo Web

BitBucket consigue repositorios privados gratis de Git

Después de usar GitHub con un repositorio público me interesé por como tener mis proyectos en repositorios privados. GitHub ofrece esta posiblidad pagando una pequeña cantidad para proyectos pequeños. Estaba interesado en alguna alternativa gratuita, le planteé la duda a mis amigos de Scalia.es y ellos me comentaron esta alternativa gratuita para repositorios privados BitBucket.org. Tengo ya un par de repositorios y la verdad es que estoy muy contento, para el uso que le estoy dando lo veo una opción realmente interesante. Esta solución es parte de la empresa Atlassian que tiene grandes productos orientados al mundo del desarrollo.

Existen otras posibilidades si no te interesa ni GitHub ni BitBucket, una opción interesante es crearte tu propio servidor Git con características con una interfaz web similar a ambos. Esto es posible gracias al software libre GitLab.

Estoy ahora tratando de montar un escenario de integración continua usando como servidor Jenkins y hacer que funcione con un repositorio de BitBucket. Cuando logre esto haré un post con los pasos que he dado.

Etiquetado con: , ,
Publicado en: Desarrollo Web

1 millón de dominios para comprobar en php

Todos los días alexa actualiza su csv con el top de 1 millón de dominios. Imagino que después de tantos scrapeos que habrá ido a parar a su servicio para sacar los datos de posición de una web, han decidido poner al alcance de todo el mundo este fichero:

http://s3.amazonaws.com/alexa-static/top-1m.csv.zip

La estructura de este es bien sencilla, son dos parámetros por línea, el primero indica la posición de Alexa y el segundo es el dominio que ocupa dicha posición.

Si trabaja desde linux como es mi caso, y quieres poner el fichero en un formato de listado de dominio tienes que seguir los pasos:

# Descarga el zip con wget
wget http://s3.amazonaws.com/alexa-static/top-1m.csv.zip
# Descomprimir el zip con unzip
unzip top-1m.csv.zip

Al descomprimir se nos queda el fichero: top-1m.csv, con la estructura que os he mencionado. Por tanto sólo nos queda crear un PHP para recorrer este fichero y hacer lo que deseemos, aquí os dejo un ejemplo básico que recorre el fichero:

$fichero = “top-1m.csv”;

$gestor = @fopen($fichero, “r”);
if ($gestor) {
while (($buffer = fgets($gestor, 4096)) !== false) {
$trozos = explode(“,”, $buffer);
$nom = trim($trozos[1]);

echo “$nom\n”;
}
if (!feof($gestor)) {
echo “Error: fallo inesperado de fgets()\n”;
}
fclose($gestor);
}

Espero que os resulte interesante esto.
FELIZ NAVIDAD!

Etiquetado con:
Publicado en: Desarrollo Web

Primeros pasos con Git usando GitHub

Dando los primeros pasos con github desde linux. Vamos a crear nuestro primer repositorio y a subir nuestro proyecto.

Antes que nada debes contar con una cuenta en GitHub, es completamente gratuita para repositorios públicos. Vamos a necesitar tener instalados dos paquetes que son ssh y git.

apt-get install ssh

apt-get install git

Vamos a configurar git para indicar nuestro nombre y email. Importante que el correo que usamos en tu@email.com es el mismo que usaste para registrarte en github.

git config –global user.name “Tu Nombre”

git config –global user.email tu@email.com

Creamos las claves para trabajar con SSH con github y copiamos nuestra clave pública en la sección de configuración de tu cuenta de github

ssh-keygen -t rsa -C tu@email.com

cat /home/tu_usuario/.ssh/id_rsa.pub

Establecemos la conexión github por ssh

ssh -T git@github.com

Y ya por fin estamos listos para crear y subir nuestro primer proyecto :) . Estando en el directorio de nuestro proyecto ejecutamos

git init

git add *

git commit -m “primer comentario”

git remote add origin https://github.com/tu_usuario/tu_repositorio.git

git push -u origin master

Y esto es todo para poner en marcha nuestro primer repositorio, espero que os sirva :)

Etiquetado con: ,
Publicado en: Desarrollo Web