Maison > développement back-end > tutoriel php > Exemple de robot d'exploration CURL d'apprentissage PHP

Exemple de robot d'exploration CURL d'apprentissage PHP

*文
Libérer: 2023-03-18 08:42:01
original
4363 Les gens l'ont consulté

Souvent, nous devons explorer certaines ressources de sites Web par lots, et pour le moment, nous devons utiliser un robot d'exploration. La base du robot est d'utiliser CURL pour simuler des requêtes HTTP, puis d'analyser les données. Cet article vous amènera à apprendre le CURL de PHP en écrivant un simple robot d'exploration Web.

Présentez d’abord quelques fonctions couramment utilisées.

curl_init 初始化一个curl对话
curl_setopt 设置curl参数,即传输选项
curl_exec 执行请求
curl_close 关闭一个curl对话
Copier après la connexion

Principalement les quatre ci-dessus

curl_errno 返回最后一次错误码,php已经定义了诸多错误枚举编码
curl_errror 返回一个保护当前会话最近一次错误的字符串
Copier après la connexion


Passons directement aux exemples ci-dessous. Les explications pertinentes sont dans les commentaires

<. 🎜>


1. Téléchargez une page Web sur Internet et remplacez "Baidu" dans le contenu par "屌Si" et affichez

<?php
/**
 * 实例描述:在网络上下载一个网页并把内容中的“百度”替换为“屌丝”之后输出
 */
$curlobj = curl_init();            // 初始化
curl_setopt($curlobj, CURLOPT_URL, "http://www.baidu.com");        // 设置访问网页的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true);           // 执行之后不直接打印出来
$output=curl_exec($curlobj);  // 执行
curl_close($curlobj);          // 关闭cURL
echo str_replace("百度","屌丝",$output);
?>
Copier après la connexion


2. Interrogez la météo actuelle à Pékin en appelant WebService

<?php
/**
 * 实例描述:通过调用WebService查询北京的当前天气
 */
$data = &#39;theCityName=北京&#39;;
$curlobj = curl_init();    
curl_setopt($curlobj, CURLOPT_URL, "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName");  
curl_setopt($curlobj, CURLOPT_HEADER, 0); 
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curlobj, CURLOPT_POST, 1);  
curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data);  
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded; charset=utf-8", 
    "Content-length: ".strlen($data)
    )); 
$rtn = curl_exec($curlobj);   
if(!curl_errno($curlobj)){
    // $info = curl_getinfo($curlobj); 
    // print_r($info);
    echo $rtn;  
} else {
  echo &#39;Curl error: &#39; . curl_error($curlobj);
}
curl_close($curlobj);
?>
Copier après la connexion


3. Simulez l'URL qui nécessite une connexion et capturez le contenu de la page Web

<?php
/**
 * 实例描述:模拟需要登录的网址并抓取网页的内容
 */
$data=array(&#39;username&#39; => &#39;promonkey&#39;, 
    &#39;password&#39; => &#39;1q2w3e&#39;,
    &#39;remember&#39;=>1);
$data=&#39;username=zjzhoufy@126.com&password=1q2w3e&remember=1&#39;;
$curlobj = curl_init();            // 初始化
curl_setopt($curlobj, CURLOPT_URL, "http://www.imooc.com/user/login");     // 设置访问网页的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true);           // 执行之后不直接打印出来
// Cookie相关设置,这部分设置需要在所有会话开始之前设置
date_default_timezone_set(&#39;PRC&#39;); // 使用Cookie时,必须先设置时区
curl_setopt($curlobj, CURLOPT_COOKIESESSION, TRUE); 
curl_setopt($curlobj, CURLOPT_HEADER, 0); 
curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, 1); // 这样能够让cURL支持页面链接跳转
curl_setopt($curlobj, CURLOPT_POST, 1);  
curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data);  
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded; charset=utf-8", 
    "Content-length: ".strlen($data)
    )); 
curl_exec($curlobj);   // 执行
curl_setopt($curlobj, CURLOPT_URL, "http://www.imooc.com/space/index");
curl_setopt($curlobj, CURLOPT_POST, 0);  
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("Content-type: text/xml"
    )); 
$output=curl_exec($curlobj);  // 执行
curl_close($curlobj);          // 关闭cURL
echo $output;
?>
Copier après la connexion


4. Capturez les informations du site Web et téléchargez la page de l'espace personnel + personnalisez la capture de saut de lien de page

<?php
/**
 * 实例描述:登录网站的信息抓取并下载个人空间页面
 * 自定义实现页面链接跳转抓取
 * 
 */
$data=&#39;username=demo_peter@126.com&password=123qwe&remember=1&#39;;
$curlobj = curl_init();            // 初始化
curl_setopt($curlobj, CURLOPT_URL, "http://www.imooc.com/user/login");     // 设置访问网页的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true);           // 执行之后不直接打印出来
// Cookie相关设置,这部分设置需要在所有会话开始之前设置
date_default_timezone_set(&#39;PRC&#39;); // 使用Cookie时,必须先设置时区
curl_setopt($curlobj, CURLOPT_COOKIESESSION, TRUE); 
curl_setopt($curlobj, CURLOPT_HEADER, 0); 
// 注释掉这行,因为这个设置必须关闭安全模式 以及关闭open_basedir,对服务器安全不利
//curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, 1);  
curl_setopt($curlobj, CURLOPT_POST, 1);  
curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data);  
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded; charset=utf-8", 
    "Content-length: ".strlen($data)
    )); 
curl_exec($curlobj);   // 执行
curl_setopt($curlobj, CURLOPT_URL, "http://www.imooc.com/space/index");
curl_setopt($curlobj, CURLOPT_POST, 0);  
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("Content-type: text/xml"
    )); 
$output=curl_redir_exec($curlobj);  // 执行
curl_close($curlobj);          // 关闭cURL
echo $output;
/**
 * 自定义实现页面链接跳转抓取
 */
function curl_redir_exec($ch,$debug="") 
{ 
    static $curl_loops = 0; 
    static $curl_max_loops = 20; 
    if ($curl_loops++ >= $curl_max_loops) 
    { 
        $curl_loops = 0; 
        return FALSE; 
    } 
    curl_setopt($ch, CURLOPT_HEADER, true); // 开启header才能够抓取到重定向到的新URL
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $data = curl_exec($ch); 
    // 分割返回的内容
    $h_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
    $header = substr($data,0,$h_len);
    $data = substr($data,$h_len - 1);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    if ($http_code == 301 || $http_code == 302) { 
        $matches = array(); 
        preg_match(&#39;/Location:(.*?)\n/&#39;, $header, $matches); 
        $url = @parse_url(trim(array_pop($matches))); 
        // print_r($url); 
        if (!$url) 
        { 
            //couldn&#39;t process the url to redirect to 
            $curl_loops = 0; 
            return $data; 
        } 
        $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)); 
        if (!isset($url[&#39;scheme&#39;])) 
            $url[&#39;scheme&#39;] = $last_url[&#39;scheme&#39;]; 
        if (!isset($url[&#39;host&#39;])) 
            $url[&#39;host&#39;] = $last_url[&#39;host&#39;]; 
        if (!isset($url[&#39;path&#39;])) 
            $url[&#39;path&#39;] = $last_url[&#39;path&#39;];
        $new_url = $url[&#39;scheme&#39;] . &#39;://&#39; . $url[&#39;host&#39;] . $url[&#39;path&#39;] . (isset($url[&#39;query&#39;])?&#39;?&#39;.$url[&#39;query&#39;]:&#39;&#39;); 
        curl_setopt($ch, CURLOPT_URL, $new_url); 
        return curl_redir_exec($ch); 
    } else { 
        $curl_loops=0; 
        return $data; 
    } 
} 
?>
Copier après la connexion


Télécharger un fichier du serveur FTP vers le

<?php
/**
 * 实例描述:把本地文件上传到FTP服务器上
 */
$curlobj = curl_init();    
$localfile = &#39;ftp01.php&#39;;
$fp = fopen($localfile, &#39;r&#39;);
curl_setopt($curlobj, CURLOPT_URL, "ftp://192.168.1.100/ftp01_uploaded.php");  
curl_setopt($curlobj, CURLOPT_HEADER, 0); 
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curlobj, CURLOPT_TIMEOUT, 300); // times out after 300s
curl_setopt($curlobj, CURLOPT_USERPWD, "peter.zhou:123456");//FTP用户名:密码
//上传和下载主要是下面子三个参数不一样
curl_setopt($curlobj, CURLOPT_UPLOAD, 1);
curl_setopt($curlobj, CURLOPT_INFILE, $fp);
curl_setopt($curlobj, CURLOPT_INFILESIZE, filesize($localfile));
$rtn = curl_exec($curlobj);  
fclose($fp); 
if(!curl_errno($curlobj)){
    echo "Uploaded successfully.";  
} else {
  echo &#39;Curl error: &#39; . curl_error($curlobj);
}
curl_close($curlobj);
?>
Copier après la connexion


6. Téléchargez une ressource HTTPS sur le réseau

<?php
/**
 * 实例描述:下载网络上面的一个HTTPS的资源
 */
$curlobj = curl_init();            // 初始化
curl_setopt($curlobj, CURLOPT_URL, "https://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/jquery.validate.js");       // 设置访问网页的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true);           // 执行之后不直接打印出来
// 设置HTTPS支持
date_default_timezone_set(&#39;PRC&#39;); // 使用Cookie时,必须先设置时区
curl_setopt($curlobj, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查从证书中检查SSL加密算法是否存在
curl_setopt($curlobj, CURLOPT_SSL_VERIFYHOST, 2); // 
$output=curl_exec($curlobj);  // 执行
curl_close($curlobj);          // 关闭cURL
echo $output;
?>
Copier après la connexion


PHP natif simule les requêtes http

Parfois, pour simplement simuler une requête http, il est un peu inutile d'utiliser curl. En fait, PHP lui-même peut déjà implémenter cette fonction,

<🎜. >


Il est nécessaire de simuler POST/GET et d'autres requêtes côté serveur, c'est-à-dire d'implémenter la simulation dans le programme PHP. Comment faire ? En d’autres termes, dans un programme PHP, si on vous donne un tableau, comment POST/GET ce tableau à une autre adresse ? Bien sûr, c'est facile de le faire en utilisant CURL, mais que se passe-t-il si vous n'utilisez pas la bibliothèque CURL ? En fait, il existe déjà une fonction connexe implémentée en PHP, et cette fonction est stream_context_create() dont je parlerai ensuite.


Montrez-vous directement le code C'est la meilleure façon :

http://www.nowamagic.net/test2.php. le code est :
$data = array(
    &#39;foo&#39;=>&#39;bar&#39;, 
    &#39;baz&#39;=>&#39;boom&#39;, 
    &#39;site&#39;=>&#39;www.nowamagic.net&#39;, 
    &#39;name&#39;=>&#39;nowa magic&#39;); 
$data = http_build_query($data); 
//$postdata = http_build_query($data);
$options = array(
    &#39;http&#39; => array(
        &#39;method&#39; => &#39;POST&#39;,
        &#39;header&#39; => &#39;Content-type:application/x-www-form-urlencoded&#39;,
        &#39;content&#39; => $data
        //&#39;timeout&#39; => 60 * 60 // 超时时间(单位:s)
    )
);
$url = "http://www.nowamagic.net/test2.php";
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
Copier après la connexion

Le résultat en cours d'exécution est :
$data = $_POST;
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
print_r( $data );
echo &#39;
';
Copier après la connexion

Array
(
    [foo] => bar
    [baz] => boom
    [site] => www.nowamagic.net
    [name] => nowa magic
)
Copier après la connexion


Quelques points clés à expliquer :


Le programme ci-dessus utilise la fonction http_build_query() pour construire une chaîne d'URL.


stream_context_create() est utilisé pour créer des options de contexte pour l'ouverture de fichiers, telles que l'accès avec POST, l'utilisation d'un proxy, l'envoi d'en-têtes, etc. Créez simplement un flux. Donnons un autre exemple :

$context = stream_context_create(array( 
    &#39;http&#39; => array( 
        &#39;method&#39;  => &#39;POST&#39;, 
        &#39;header&#39;  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.&#39;:&#39;.$password)). 
        "Content-type: application/x-www-form-urlencoded\r\n", 
        &#39;content&#39; => http_build_query(array(&#39;status&#39; => $message)), 
        &#39;timeout&#39; => 5, 
    ), 
)); 
$ret = file_get_contents(&#39;http://twitter.com/statuses/update.xml&#39;, false, $context);
Copier après la connexion


Les options de contexte créées par stream_context_create peuvent être utilisées à la fois pour les flux et les systèmes de fichiers ). Il est plus utile pour les fonctions telles que file_get_contents, file_put_contents et readfile qui opèrent directement sur les noms de fichiers sans descripteurs de fichiers. L'ajout d'en-têtes à stream_context_create n'est qu'une partie de la fonction. Vous pouvez également définir des proxys, des délais d'attente, etc. Cela rend la fonction d'accès au Web pas plus faible que curl.


stream_context_create() Fonction : Créer et renvoyer un flux de données texte et appliquer diverses options, qui peuvent être utilisées pour les paramètres de délai d'attente et les serveurs proxy de fopen(), file_get_contents() et d'autres processus, méthode de demande et processus spécial de définition des informations d'en-tête.


stream_context_create peut également résoudre le traitement du délai d'attente de file_get_contents en ajoutant l'option de délai d'attente :

$opts = array(
    &#39;http&#39;=>array(
    &#39;method&#39;=>"GET",
    &#39;timeout&#39;=>60,
  )
);
//创建数据流上下文
$context = stream_context_create($opts);
$html =file_get_contents(&#39;http://www.nowamagic.net&#39;, false, $context);
//fopen输出文件指针处的所有剩余数据:
//fpassthru($fp); //fclose()前使用
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal