robot d'exploration simple php

大家讲道理
Libérer: 2023-03-07 22:32:01
original
8810 Les gens l'ont consulté

Conception simple du robot

Introduction

Dire qu'il s'agit d'un robot est un peu exagéré, mais le nom est juste, j'ai donc ajouté le mot "simple" devant pour montrer ça
Il s'agit d'un robot castré, qui peut être utilisé simplement ou avec lequel jouer.
L'entreprise a récemment lancé une nouvelle activité pour capturer les données des produits concurrents. Après avoir lu le système de capture écrit par un ancien camarade de classe, il y a certains problèmes
Les règles sont trop strictes, qu'il s'agisse d'évolutivité ou de polyvalence. La surface est un peu faible. Le système précédent devait faire une liste
puis ramper à partir de cette liste. Il n'y avait aucune notion de profondeur, ce qui était un défaut pour les robots. Par conséquent, j'ai décidé de créer un
crawler légèrement plus général, d'ajouter le concept de profondeur et d'améliorer l'évolutivité et la généralité.

Conception

Nous avons convenu ici que le contenu à traiter (peut-être l'URL, le nom d'utilisateur, etc.) nous l'appellerons entité.
Compte tenu de l'évolutivité, le concept de file d'attente est adopté ici. Toutes les entités à traiter sont stockées dans la file d'attente,
retire une entité de la file d'attente. le traitement est terminé, stockez et stockez les entités nouvellement capturées dans la file d'attente. Bien sûr, ici
nous devons également effectuer un traitement de déduplication du stockage et un traitement de déduplication de file d'attente pour empêcher le programme de traitement d'effectuer un travail inutile.

  +--------+ +-----------+ +----------+
  | entity | |  enqueue  | |  result  |
  |  list  | | uniq list | | uniq list|
  |        | |           | |          |
  |        | |           | |          |
  |        | |           | |          |
  |        | |           | |          |
  +--------+ +-----------+ +----------+
Copier après la connexion

Lorsque chaque entité entre dans la file d'attente, 入队排重队列 définit l'indicateur d'entité de mise en file d'attente sur un, puis ne rejoint plus la file d'attente. Lorsque l'entité
est traitée, les données de résultat sont obtenues après. les données de résultat sont traitées Marquez les versets résultants comme 结果数据排重list, bien sûr
, ici vous pouvez également faire mise à jour traitement, et le code peut être compatible.

                     +-------+                     |  开始 |                     +---+---+                         |                         v                     +-------+  enqueue deep为1的实体                     | init  |-------------------------------->                      +---+---+  set 已经入过队列 flag                         |                             v                        +---------+ empty queue  +------+            +------>| dequeue +------------->| 结束 |            |       +----+----+              +------+            |            |                                       |            |                                       |            |                                       |            v                                       |    +---------------+  enqueue deep为deep+1的实体                         |    | handle entity |------------------------------>             |    +-------+-------+  set 已经入过队列 flag                         |            |                                   |            |                                   |            v                                   |    +---------------+  set 已经处理过结果 flag            |    | handle result |-------------------------->             |    +-------+-------+                         |            |                                 +------------+
Copier après la connexion


Stratégie de crawling (réponse anti-triche)

Afin de crawler certains sites web, la chose la plus redoutée est de bloquer les adresses IP et de bloquer Adresses IP. Mais sans agent, je ne peux que le faire. Par conséquent, la stratégie de crawl
est toujours très importante.

Avant d'explorer, vous pouvez rechercher sur Internet des informations pertinentes sur le site Web à explorer, voir si quelqu'un l'a déjà exploré et absorber son
expérience. Ensuite, je dois analyser attentivement moi-même la demande de site Web pour voir si leur demande de site Web apportera des paramètres
spéciaux ? Y aura-t-il des cookies associés au statut non connecté ? La dernière chose que j'ai essayée a été de définir une fréquence de capture aussi élevée que possible.

Si vous devez vous connecter au site Web pour être exploré, vous pouvez enregistrer un lot de comptes, puis simuler une connexion réussie et demander à votre tour

Ce sera encore plus gênant si la connexion nécessite un.
code de vérification , vous pouvez essayer de vous connecter manuellement puis enregistrer le cookie (bien sûr , si vous en avez la possibilité, vous pouvez essayer la reconnaissance OCR). Bien sûr, vous devez toujours prendre en compte les problèmes mentionnés dans le paragraphe précédent après vous être connecté. Cela ne signifie pas que tout ira bien
après la connexion. Certains sites Web verront leurs comptes bloqués s'ils sont explorés trop fréquemment après la connexion. dans.

Par conséquent, essayez de trouver une méthode qui ne nécessite pas de connexion. Il est difficile de se connecter à des comptes bloqués, de demander un compte et de changer de compte.

Source et profondeur des données d'exploration

La sélection initiale de la source de données est également importante. Ce que je veux faire, c'est explorer une fois par jour, je recherche donc un endroit où le site Web d'exploration est mis à jour quotidiennement

, afin que l'action d'initialisation puisse être entièrement automatique et que je n'ai fondamentalement pas besoin de la gérer . L'exploration démarrera quotidiennement
les mises à jour sont effectuées automatiquement.

La profondeur d'exploration est également très importante. Elle doit être déterminée en fonction du site Web spécifique, des besoins et du contenu qui a été exploré, et

capturer autant de données du site Web que possible.

Optimisation

Après l'exécution dans l'environnement de production, plusieurs endroits ont été modifiés.

La première est la file d'attente, qui a été transformée en une structure semblable à une pile. Parce que dans la file d'attente précédente, les entités de faible profondeur étaient toujours exécutées en premier

Cela entraînerait de plus en plus de contenu dans la file d'attente et occuperait beaucoup de mémoire. Maintenant, elle est transformée en structure de pile, et
récursion. est traité en premier. Complétez toute la profondeur d'une entité , puis traitez l'entité suivante. Par exemple, pour les 10 entités initiales (deep=1), la profondeur d'exploration maximale
est de 3. Il y a 10 sous-entités sous chaque entité, et la longueur maximale de leurs files d'attente est :

    队列(lpush,rpop)              => 1000个
    修改之后的队列(lpush,lpop)   => 28个
Copier après la connexion
ce qui précède Les deux méthodes peuvent obtenir le même effet, mais vous pouvez voir que la longueur de la file d'attente est très différente, nous avons donc changé pour la deuxième

méthode.

La limite de profondeur maximale est traitée lors de l'adhésion à la file d'attente. Si la profondeur maximale est dépassée, elle sera directement supprimée. De plus, la longueur maximale de la file d'attente

a également été limitée pour éviter des problèmes inattendus.

Code

Ce qui suit est un code long et ennuyeux. Au départ, je voulais le publier sur

github, mais je pensais que le projet était un peu petit, alors j'ai j'ai pensé le publier directement. J'espère que mes amis parleront des mauvaises choses, qu'il s'agisse du code ou du design.

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