[RESOLU] Problème user agent simple html dom

Eléphant du PHP | 134 Messages

03 juin 2016, 11:14

Bonjour, je travaille actuellement sur un scrapper j'utiliser la lib Simple html dom, je rencontre un soucis sur certains sites.
Pour chaques url je vérifie si elles retournent un code 200, je suis tombé sur des sites qui refusent ma connexion et me demandent de changer de configuration pour accéder à leurs sites, le truc c'est que je précise bien le user agent
$opts = array(
            'http' => array(
                'method' => "GET",
                'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
                'request_fulluri' => true
            )
        );

        $context = stream_context_create($opts);
        $html = file_get_html($url, false, $context);
j'ai donc essayé directement via ma console pour etre sur que mon user agent n'était pas envoyé dans mon script php:

Code : Tout sélectionner

curl http://monurl.com/
me retourne bien une erreur par contre si je précise le user agent ça fonctionne

Code : Tout sélectionner

curl -A " Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" http://monurl.com/
donc suite à ce test j'ai essayé de forcer le useragent dans la config php avec :
ini_set('user_agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36');
mais ça ne change rien si vous avez des solutions je suis intéressé , merci d'avance !!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 juin 2016, 11:37

Bonjour,

Avec Curl et PHP il faut utiliser ce paramètre :
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36');
Avec la librairie que tu utilises, aucune idée, il faut que tu regardes dans leur doc ou que tu poses la question à l'auteur
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 134 Messages

03 juin 2016, 11:42

Merci de ta réponse, donc je suis obligé d'utiliser curl et non pas file_get_html?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 juin 2016, 11:46

Je ne connais pas la fonction file_get_html() et ce n'est pas une fonction standard PHP.
Donc soit tu la modifies pour qu'elle fonctionne comme tu veux (ou tu demandes à son auteur)
soit tu utilises des fonctions officielles comme curl ou file_get_contents
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 134 Messages

03 juin 2016, 11:49

en fait file_get_html est une fonction de simple html dom
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)
{
    // We DO force the tags to be terminated.
    $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
    // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done.
    $contents = file_get_contents($url, $use_include_path, $context, $offset);
    // Paperg - use our own mechanism for getting the contents as we want to control the timeout.
    //$contents = retrieve_url_contents($url);
    if (empty($contents) || strlen($contents) > MAX_FILE_SIZE)
    {
        return false;
    }
    // The second parameter can force the selectors to all be lowercase.
    $dom->load($contents, $lowercase, $stripRN);
    return $dom;
}

Eléphant du PHP | 134 Messages

03 juin 2016, 13:10

Donc j'ai fait
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36');
$response = curl_exec($ch);
curl_close($ch);
$html = str_get_html($response);
mais j'ai ça en retour :s
Empty reply from server

Eléphant du PHP | 134 Messages

03 juin 2016, 13:35

Problème résolu je poste le code curl que j'utilise
$ch= curl_init();
curl_setopt ($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch,CURLOPT_VERBOSE,1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)');
curl_setopt ($ch, CURLOPT_REFERER,'http://www.google.com'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_POST,0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 20);

$html= curl_exec($ch);
    $html = str_get_html($html);
Bonjour,

Avec Curl et PHP il faut utiliser ce paramètre :
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36');
Avec la librairie que tu utilises, aucune idée, il faut que tu regardes dans leur doc ou que tu poses la question à l'auteur
Merci de m'avoir guidé vers la solution ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 juin 2016, 13:56

Sinon vu que la lib que tu utilises est en fait un wrapper de file_get_contents(), c'est peut être en déclarant le user-agent différement que ça aurait pu marcher :
https://joshtronic.com/2013/06/04/speci ... _contents/
Quand tout le reste a échoué, lisez le mode d'emploi...