Table des matières
1. Robot d'exploration simple PHP – prototype " >1. Robot d'exploration simple PHP – prototype
2. Utiliser crul lib" >2. Utiliser crul lib
3.file_get_contents/stream_get_contents与curl对比" >3.file_get_contents/stream_get_contents与curl对比
3.1 file_get_contents/stream_get_contents对比" >3.1 file_get_contents/stream_get_contents对比
3.2 file_get_contents/stream_get_contents与curl对比 " >3.2 file_get_contents/stream_get_contents与curl对比 
Maison développement back-end tutoriel php Résumé des points de connaissance de la technologie des robots d'exploration PHP

Résumé des points de connaissance de la technologie des robots d'exploration PHP

Apr 03, 2018 am 11:33 AM
php 技术 知识点


Il existe de nombreux frameworks de robots, les plus populaires sont basés sur python, nodejs, java, C#, PHP, parmi lesquels les robots basés sur python sont les plus populaires. sont déjà exploités par un ensemble de logiciels insensés, tels que Octopus, Locomotive et d'autres logiciels.

La première chose que nous essayons aujourd'hui est d'utiliser PHP pour implémenter un programme d'exploration. Tout d'abord, entraînez-vous sans utiliser de framework d'exploration pour comprendre les principes des robots d'exploration, puis utilisez la bibliothèque et le framework PHP. et des extensions pour la pratique.



1. Robot d'exploration simple PHP – prototype

Principe du crawler :

  • Étant donné l'url d'origine

  • Analyser le lien et obtenir le contenu du lien en fonction de l'expression régulière définie

  • Certains mettront à jour l'URL d'origine avant de procéder aux liens ; sont analysés pour un contenu spécifique et le cycle se répète.

  • Enregistrez le contenu obtenu dans la base de données (mysql) ou dans un fichier local

Ce qui suit est un exemple tiré d'Internet, listons-le et analysons-le
De
<code style="margin:0px;padding:2px 4px;max-width:100%;font-family:Consolas, Inconsolata, Courier, monospace;font-size:14px;color:rgb(199,37,78);white-space:nowrap;line-height:22px;background-color:rgb(249,242,244);"><span style="margin:0px;padding:0px;max-width:100%;font-size:15px;">main</span>mainDémarrage de la fonction

<?php/** * 爬虫程序 -- 原型 * 从给定的url获取html内容 * @param string $url  * @return string  */function _getUrlContent($url) { $handle = fopen($url, "r");   
 if ($handle) {        
$content = stream_get_contents($handle, -1);  
 //读取资源流到一个字符串,第二个参数需要读取的最大的字节数。默认是-1(读取全部的缓冲数据)        // $content = file_get_contents($url, 1024 * 1024);        return $content;    } else {       
         return false;    } } /** * 从html内容中筛选链接 * @param string $web_content  * @return array  */function _filterUrl($web_content) {    $reg_tag_a = &#39;/<[a|A].*?href=[\&#39;\"]{0,1}([^>\&#39;\"\ ]*).*?>/&#39;;    
$result = preg_match_all($reg_tag_a, $web_content, $match_result);    
if ($result) {        
   return $match_result[1];    } } /** * 修正相对路径 * @param string $base_url  * @param array $url_list  * @return array  */function _reviseUrl($base_url, $url_list) {    $url_info = parse_url($base_url);//解析url    $base_url = $url_info["scheme"] . &#39;://&#39;;    
    if ($url_info["user"] && $url_info["pass"]) {       
     $base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";    }     $base_url .= $url_info["host"];   
     if ($url_info["port"]) {  
     $base_url .= ":" . $url_info["port"];    }     $base_url .= $url_info["path"];   
        if (is_array($url_list)) {       
         foreach ($url_list as $url_item) { 
         if (preg_match(&#39;/^http/&#39;, $url_item)) { 
                             // 已经是完整的url                $result[] = $url_item;            } else { // 不完整的url
                $real_url = $base_url . &#39;/&#39; . $url_item; 
                $result[] = $real_url;            }         }         return $result;    } else { 
        return;    } } /** * 爬虫 * @param string $url  * @return array  */function crawler($url) {    $content = _getUrlContent($url); 
     if ($content) {  
          $url_list = _reviseUrl($url, _filterUrl($content)); 
          if ($url_list) {  
        return $url_list;        } else { 
         return ;        }     } else {
        return ;    } } /** * 测试用主程序 */function main() {    $file_path = "url-01.txt";   
    $current_url = "http://www.baidu.com/"; //初始url    if(file_exists($file_path)){        unlink($file_path);    }    
    $fp_puts = fopen($file_path, "ab"); //记录url列表    $fp_gets = fopen($file_path, "r"); //保存url列表    do {        
          $result_url_arr = crawler($current_url); 
          if ($result_url_arr) { 
              foreach ($result_url_arr as $url) {                fputs($fp_puts, $url . "\r\n");            }         }     } 
while ($current_url = fgets($fp_gets, 1024)); //不断获得url} main();?>
Copier après la connexion

2. Utiliser crul lib

Curl est une bibliothèque relativement mature. Elle fait du bon travail en matière de gestion des exceptions, d'en-tête http, de POST, etc. L'important est qu'il est plus facile d'utiliser MySQL sous PHP pour les opérations d'entreposage. Pour des instructions spécifiques sur curl, vous pouvez consulter la documentation officielle de PHP, mais c'est plus gênant en termes de Curl multithread (Curl_multi).

Activer crul

Pour le système winow :

- Modifier dans php.in (commenter ; il suffit de le supprimer)

extension =php_curl.dll
  • Déplacez les fichiers libeay32.dll, ssleay32.dll, libssh2.dll et php_curl4 sous php/ext dans Windows /system32

    .

Étapes pour utiliser le robot crul :

- L'idée de base de l'utilisation de la fonction cURL est d'abord d'utiliser curl_init() pour en initialiser une cURL session;
- Ensuite, vous pouvez définir toutes les options dont vous avez besoin via curl_setopt();
- Ensuite, utilisez curl_exec() pour exécuter la session
- Une fois l'exécution de la session terminée, utilisez curl_close() pour clôturer la séance.

<🎜>

例子

$ch = curl_init("http://www.example.com/");

$fp = fopen("example_homepage.txt", "w" );curl_setopt($ch, CURLOPT_FILE, $fp);curl_setopt($ch , CURLOPT_HEADER, 0);curl_exec($ch);curl_close($ch);fclose($fp);?>


一个完整点的例子:

<?php/** * 将demo1-01换成curl爬虫 * 爬虫程序 -- 原型 * 从给定的url获取html内容 * @param string $url  * @return string  */function _getUrlContent($url) {    $ch=curl_init();  //初始化一个cURL会话    /*curl_setopt 设置一个cURL传输选项*/    //设置需要获取的 URL 地址    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     curl_setopt($ch,CURLOPT_HEADER,1);    // 设置浏览器的特定header    curl_setopt($ch, CURLOPT_HTTPHEADER,
     array(       
     "Host: www.baidu.com",        
    "Connection: keep-alive",        
    "Accept: text/html,
    application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Upgrade-Insecure-Requests: 1",
     "DNT:1", 
     "Accept-Language: zh-CN,zh;q=0.8,en-GB;q=0.6,en;q=0.4,en-US;q=0.2", 
       ));  

    $result=curl_exec($ch);//执行一个cURL会话    $code=curl_getinfo($ch,CURLINFO_HTTP_CODE);// 最后一个收到的HTTP代码    if($code!=&#39;404&#39; && $result){       
       return $result;    }    curl_close($ch);//关闭cURL} /** * 从html内容中筛选链接 * @param string $web_content  * @return array  */function _filterUrl($web_content) {    $reg_tag_a = &#39;/<[a|A].*?href=[\&#39;\"]{0,1}([^>\&#39;\"\ ]*).*?>/&#39;;   
   $result = preg_match_all($reg_tag_a, $web_content, $match_result);    
   if ($result) {       
     return $match_result[1];    } } /** * 修正相对路径 * @param string $base_url  * @param array $url_list  * @return array  */function _reviseUrl($base_url, $url_list) {    $url_info = parse_url($base_url);//解析url    $base_url = $url_info["scheme"] . &#39;://&#39;;    
     if ($url_info["user"] && $url_info["pass"]) { 
        $base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";    }     $base_url .= $url_info["host"];    
    if ($url_info["port"]) { 
       $base_url .= ":" . $url_info["port"];    }     $base_url .= $url_info["path"];   
    if (is_array($url_list)) { 
      foreach ($url_list as $url_item) { 
       if (preg_match(&#39;/^http/&#39;, $url_item)) {
                // 已经是完整的url                $result[] = $url_item;            } else { 
               // 不完整的url                $real_url = $base_url . &#39;/&#39; . $url_item; 
               $result[] = $real_url;            }         }         return $result;    } else {
        return;    } } /** * 爬虫 * @param string $url  * @return array  */function crawler($url) {    $content = _getUrlContent($url);
    if ($content) {
        $url_list = _reviseUrl($url, _filterUrl($content)); 
       if ($url_list) {
            return $url_list;        } else { 
           return ;        }     } else {
        return ;    } } /** * 测试用主程序 */function main() {    $file_path = "./url-03.txt";
    if(file_exists($file_path)){        unlink($file_path);    }    $current_url = "http://www.baidu.com"; //初始url    //记录url列表  ab- 追加打开一个二进制文件,并在文件末尾写数据    $fp_puts = fopen($file_path, "ab");     //保存url列表 r-只读方式打开,将文件指针指向文件头    $fp_gets = fopen($file_path, "r");     do {
        $result_url_arr = crawler($current_url);
        echo "<p>$current_url</p>";
        if ($result_url_arr) { 
           foreach ($result_url_arr as $url) {                fputs($fp_puts, $url . "\r\n");            }         }     } while ($current_url = fgets($fp_gets, 1024)); //不断获得url} main();?>
Copier après la connexion

要对https支持,需要在_getUrlContent函数中加入下面的设置:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ; 
curl_setopt($ch, CURLOPT_USERPWD, "username:password");    
curl_setopt($ch, CURLOPT_SSLVERSION,3); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
Copier après la connexion

结果疑惑:
我们通过1和2部分得到的结果差异很大,第1部分能得到四千多条url数据,而第2部分却一直是45条数据。

还有我们获得url数据可能会有重复的,这部分处理在我的github上,对应demo2-01.php,或者demo2-02.php

3.file_get_contents/stream_get_contents与curl对比

3.1 file_get_contents/stream_get_contents对比

  • stream_get_contents — 读取资源流到一个字符串
    与 [file_get_contents()]一样,但是 stream_get_contents() 是对一个已经打开的资源流进行操作,并将其内容写入一个字符串返回


$handle = fopen($url, "r");

$content = stream_get_contents($handle, -1);

//Lire le flux de ressources dans une chaîne, le deuxième paramètre doit lire le nombre maximum de octets. La valeur par défaut est -1 (lire toutes les données mises en mémoire tampon)


  • file_get_contents — 将整个文件读入一个字符串

<code style="margin:0px;padding:0px;max-width:100%;font-family:Consolas, Inconsolata, Courier, monospace;white-space:pre;"><span style="color:#4f4f4f;margin:0px;padding:0px;max-width:100%;">$content</span> = file_get_contents(<span style="color:#4f4f4f;margin:0px;padding:0px;max-width:100%;">$url</span>, <span style="margin:0px;padding:0px;max-width:100%;">1024</span> * <span style="margin:0px;padding:0px;max-width:100%;">1024</span>);<br/><span style="font-family:&#39;PingFang SC&#39;, &#39;Microsoft YaHei&#39;, SimHei, Arial, SimSun;color:#999999;margin:0px;padding:0px;max-width:100%;text-align:justify;background-color:rgb(238,240,244);">【注】 如果要打开有特殊字符的 URL (比如说有空格),就需要使用进行 URL 编码。</span></code>
Copier après la connexion

3.2 file_get_contents/stream_get_contents与curl对比 

- fopen /file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。

  • fopen /file_get_contents 在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。

  • fopen / file_get_contents 函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。

  • curl 可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据

相关推荐:

一个简单的开源PHP爬虫框架『Phpfetcher』

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

See all articles