PHP curl implémente la collecte hors site (recommandé)

PHPz
Libérer: 2023-03-07 09:32:01
original
1652 Les gens l'ont consulté

curl est une bibliothèque spécialement utilisée pour l'interaction réseau. Elle fournit de nombreuses options de personnalisation pour gérer différents environnements. La stabilité est naturellement supérieure à file_get_contents

Raison du choix de curl

Concernant curl et file_get_contents, voici une comparaison facile à comprendre :
file_get_contents est en fait une version fusionnée d'un ensemble de fonctions intégrées d'opération de fichiers, telles que file_exists, fopen, fread, fclose, spécialement prévu pour les paresseux Il est utilisé par les gens, et il est principalement utilisé pour traiter les fichiers locaux, mais à cause des paresseux, il ajoute également la prise en charge des fichiers réseau
curl est une bibliothèque spécialement utilisée pour l'interaction réseau, fournissant ; a Les options personnalisées du tas sont utilisées pour gérer différents environnements, et la stabilité est naturellement supérieure à celle de file_get_contents.

Comment utiliser

1. Activez la prise en charge de curl

Étant donné que l'environnement php n'active pas la prise en charge de curl par défaut après l'installation, vous devez pour modifier le fichier php.ini, recherchez;extension=php_curl.dll, supprimez les deux points devant et redémarrez le service;

2 Utilisez curl pour capturer des données

Le code est le suivant. :

// 初始化一个 cURL 对象 
$curl = curl_init(); 
// 设置你需要抓取的URL 
curl_setopt($curl, CURLOPT_URL, 'http://www.cmx8.cn'); 
// 设置header 
curl_setopt($curl, CURLOPT_HEADER, 1); 
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
// 运行cURL,请求网页 
$data = curl_exec($curl); 
// 关闭URL请求 
curl_close($curl);
Copier après la connexion

3. Recherchez les données clés grâce à une correspondance régulière

Le code est le suivant :

//$data是curl_exec返回的的值,即采集的目标内容 
preg_match_all("/<li class=\"item\">(.*?)<\/li>/",$data, $out, PREG_SET_ORDER); 
foreach($out as $key => $value){ 
    //此处$value是数组,同时记录找到带匹配字符的整句和单独匹配的字符 
    echo &#39;匹配到的整句:&#39;.$value[0].&#39;
&#39;; 
    echo &#39;单独匹配到的:&#39;.$value[1].&#39;
&#39;; 
}
Copier après la connexion

Conseils

1. settings

Grâce à curl_setopt( $ch, opt), vous pouvez définir certains paramètres de délai d'attente, notamment :

CURLOPT_TIMEOUT définit le nombre maximum de secondes pendant lesquelles cURL est autorisé à s'exécuter.
CURLOPT_TIMEOUT_MS définit le nombre maximum de millisecondes pendant lesquelles cURL est autorisé à s'exécuter. (Ajouté dans cURL 7.16.2. Disponible à partir de PHP 5.2.3.)
CURLOPT_CONNECTTIMEOUT Le temps d'attente avant d'initier une connexion S'il est défini sur 0, il attendra infiniment.
CURLOPT_CONNECTTIMEOUT_MS Le temps d'attente pour une tentative de connexion, en millisecondes. S'il est défini sur 0, attendez indéfiniment. Ajouté dans cURL 7.16.2. Disponible à partir de PHP 5.2.3.
CURLOPT_DNS_CACHE_TIMEOUT définit l'heure de sauvegarde des informations DNS en mémoire, la valeur par défaut est de 120 secondes.

Le code est le suivant :

curl_setopt($ch, CURLOPT_TIMEOUT, 60);   //只需要设置一个秒的数量就可以 
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);    //注意,毫秒超时一定要设置这个 
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);  //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用
Copier après la connexion

2. Soumettez les données par courrier et conservez les cookies

Le code est le suivant :

//以下摘抄一个例子过来,用于学习借鉴: 
//Curl 模拟登录 discuz 程序,适合DZ7.0 
!extension_loaded(&#39;curl&#39;) && die(&#39;The curl extension is not loaded.&#39;);    
$discuz_url = &#39;http://www.lxvoip.com&#39;;//论坛地址    
$login_url = $discuz_url .&#39;/logging.php?action=login&#39;;//登录页地址    
$get_url = $discuz_url .&#39;/my.php?item=threads&#39;; //我的帖子    
$post_fields = array();    
//以下两项不需要修改    
$post_fields[&#39;loginfield&#39;] = &#39;username&#39;;    
$post_fields[&#39;loginsubmit&#39;] = &#39;true&#39;;    
//用户名和密码,必须填写    
$post_fields[&#39;username&#39;] = &#39;lxvoip&#39;;    
$post_fields[&#39;password&#39;] = &#39;88888888&#39;;    
//安全提问    
$post_fields[&#39;questionid&#39;] = 0;    
$post_fields[&#39;answer&#39;] = &#39;&#39;;    
//@todo验证码    
$post_fields[&#39;seccodeverify&#39;] = &#39;&#39;;    
//获取表单FORMHASH    
$ch = curl_init($login_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    
$contents = curl_exec($ch);    
curl_close($ch);    
preg_match(&#39;/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i&#39;, $contents, $matches);    
if(!empty($matches)) {    
    $formhash = $matches[1];    
} else {    
    die(&#39;Not found the forumhash.&#39;);    
}    
//POST数据,获取COOKIE    
$cookie_file = dirname(__FILE__) . &#39;/cookie.txt&#39;;    
//$cookie_file = tempnam(&#39;/tmp&#39;);    
$ch = curl_init($login_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    
curl_setopt($ch, CURLOPT_POST, 1);    
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);    
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);    
curl_exec($ch);    
curl_close($ch);    
//带着上面得到的COOKIE获取需要登录后才能查看的页面内容    
$ch = curl_init($get_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);    
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);    
$contents = curl_exec($ch);    
curl_close($ch);    
var_dump($contents);
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