2010-12-28 62 views
17

Estoy tratando de hacer un webcraper. Lo hice en mi máquina local y funciona muy bien allí. Cuando ejecuto el mismo en mi servidor, muestra un 403 error prohibido. Estoy usando el PHP Simple HTML DOM Parser. El error que consigo en el servidor es la siguiente:file_get_contents devuelve 403 prohibido

Advertencia: file_get_contents (http://example.com/viewProperty.html?id=7715888) [function.file-get-contents]: No se pudo para abrir la secuencia: ¡la solicitud HTTP falló! HTTP/1.1 403 Forbidden en /home/scraping/simple_html_dom.php en línea 40

La línea de código de activación es:

$url="http://www.example.com/viewProperty.html?id=".$id; 

$html=file_get_html($url); 

He comprobado el php.ini en el servidor y allow_url_fopen está activado. La posible solución puede ser usar curl, pero necesito saber dónde me estoy equivocando.

+0

¿Es el servidor tuyo? Si es así, parece que usted o su servicio de alojamiento han configurado la seguridad para evitar que se elimine. –

+0

No es 'mi' servidor, pero es un servidor dedicado. – absk

+0

He leído mal la pregunta. Pensé que estaba eliminando su propio sitio (es decir, un sitio que tiene permiso explícito para raspar). @Pekka tiene razón. –

Respuesta

13

Esto no es un problema con su secuencia de comandos, pero con el recurso que está solicitando. El servidor web está devolviendo el código de estado "prohibido".

Podría ser que bloquea secuencias de comandos PHP para evitar el raspado, o su IP si ha realizado demasiadas solicitudes.

Probablemente deba hablar con el administrador del servidor remoto.

+2

Pero al mismo tiempo, funciona bien en mi servidor local. El problema parece ser con mi configuración de servidor de alguna manera. – absk

+4

@absk no, el '403 prohibido' es claramente del servidor remoto. La conexión funciona bien; prueba con una dirección IP diferente para verificar. Podría ser que la IP de su servidor esté bloqueada en el extremo del servidor remoto –

5

Puede cambiarlo así en la clase de analizador de la línea 35 y sucesivamente.

function curl_get_contents($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 

function file_get_html() 
{ 
    $dom = new simple_html_dom; 
    $args = func_get_args(); 
    $dom->load(call_user_func_array('curl_get_contents', $args), true); 
    return $dom; 
} 

¿Has probado otro sitio?

+1

¿Pero cómo se supone que esto arregle un 403 remoto? –

+0

Mencionó cURL, por lo que la primera parte de la respuesta fue para eso y la segunda "¿Has probado otro sitio?", O podría darnos un enlace para verificar. Sé que 403 es remoto, por eso le sugiero que pruebe en otro sitio. –

+0

Por lo tanto, es obtener datos de otros sitios. Parece que mi IP acaba de ser incluida en la lista negra. ¿De cualquier manera? – absk

3

Parece que el servidor remoto tiene algún tipo de bloqueo. Puede ser por agente de usuario, si es el caso, puede probar a usar curl para simular el agente de usuario de un navegador web como esta:

$url="http://www.example.com/viewProperty.html?id=".$id; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
$html = curl_exec($ch); 
curl_close($ch); 
0

¿verificó sus permisos de archivo? Configuré 777 en mi archivo (en localhost, obviamente) y arreglé el problema.

3

escribir esto en simple_html_dom.php para mí funcionó

function curl_get_contents($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
$html = curl_exec($ch); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 

function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) 
{ 
    $dom = new simple_html_dom; 
    $args = func_get_args(); 
    $dom->load(call_user_func_array('curl_get_contents', $args), true); 
    return $dom; 
    //$dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); 

} 
5

Sé que es bastante un viejo hilo, pero el pensamiento de compartir algunas ideas.

Es muy probable que si no obtiene ningún contenido mientras accede a una página web, probablemente no desee que pueda obtener el contenido. Entonces, ¿cómo identifica que un script está intentando acceder a la página web, no a un humano? En general, es el encabezado User-Agent en la solicitud HTTP enviada al servidor.

Para que el sitio web piense que la secuencia de comandos que accede a la página web también es humana debe cambiar el encabezado User-Agent durante la solicitud. Es probable que la mayoría de los servidores web permitan su solicitud si establece el encabezado User-Agent en un valor que utiliza un navegador web común.

Una lista de los agentes de usuario comunes utilizados por los navegadores se enumeran a continuación:

  • Chrome: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'

  • Firefox: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'

  • etc ...


$context = stream_context_create(
    array(
     "http" => array(
      "header" => "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" 
     ) 
    ) 
); 

echo file_get_contents("www.google.com", false, $context); 

Este código, falsifica el agente de usuario y envía la solicitud al https://google.com.

Referencias:

Saludos!

2

Comprendo que esto es una vieja pregunta, pero ...

Sólo la creación de mi entorno limitado local en Linux con php7 y corrió a través de este. Usando las secuencias de comandos de ejecución del terminal, php llama a php.ini para la CLI. Descubrí que la opción "user_agent" estaba comentada. Lo desincomenté y agregué un agente de usuario de Mozilla, ahora funciona.

0

Obtuve el mismo pb. Yo sólo activado Youtube API de los desarrolladores de la consola de Google ... y funcionó (no más prohibido :-)

No sé si se deprecia el tema, pensé sólo para compartir la idea mejores deseos

Cuestiones relacionadas