Crawler de l'entrée à la prison (5) - robot d'exploration multithread et algorithmes de recherche communs

Le contenu de l'article provient de "python crawler development"

5.1 Robot d'exploration multithread

5.1.1 Avantages du multithreading

Après avoir maîtrisé les requêtes et les expressions régulières, vous pouvez commencer à explorer certaines URL simples en pratique.
Cependant, le robot d'exploration n'a actuellement qu'un seul processus et un seul thread, il est donc appelé un robot d'exploration à thread unique . Un robot d'exploration à thread unique ne visite qu'une page à la fois et ne peut pas utiliser pleinement la bande passante réseau de l'ordinateur. Une page ne fait que quelques centaines de Ko au maximum, donc lorsqu'un crawler parcourt une page, la vitesse supplémentaire du réseau et le temps entre le lancement de la requête et l'obtention du code source sont gaspillés. Si le crawler peut accéder à 10 pages en même temps, cela équivaut à 10 fois la vitesse de crawling. Afin d'atteindre cet objectif, il est nécessaire d'utiliser la technologie multi-threading.

Le langage Python a un verrou global d'interpréteur (GIL). Cela conduit au fait que le multi-threading de Python est un pseudo-multi-threading, c'est-à-dire qu'il s'agit essentiellement d'un thread, mais ce thread ne fait chaque chose que pendant quelques millisecondes, enregistre la scène après quelques millisecondes et fait d'autres choses. après quelques millisecondes, puis fait d'autres choses après quelques millisecondes. Après un tour, revenez à la première chose, restaurez la scène et faites encore quelques millisecondes, et continuez à changer... Un seul fil au niveau micro c'est comme faire plusieurs choses en même temps au niveau macro. Ce mécanisme a peu d'effet sur les opérations gourmandes en E/S (Entrée/Sortie, entrée/sortie), mais dans les opérations gourmandes en CPU, puisqu'un seul cœur du CPU peut être utilisé, cela aura un impact très négatif sur les performances. gros impact. Par conséquent, lorsqu'il s'agit de programmes intensifs en calcul, il est nécessaire d'utiliser plusieurs processus.Les multiples processus de Python ne sont pas affectés par le GIL. Les robots d'exploration sont des programmes gourmands en E/S, donc l'utilisation du multithreading peut grandement améliorer l'efficacité du crawl.

5.1.2 Bibliothèque de multitraitement : multiprocessing

multiprocessing lui-même est la bibliothèque de multitraitement de Python pour gérer les opérations liées au multitraitement. Cependant, étant donné que les processus et les processus ne peuvent pas directement partager la mémoire et les ressources de la pile, et que la surcharge de démarrage d'un nouveau processus est beaucoup plus importante que celle des threads, l'utilisation du multi-threading pour l'exploration présente plus d'avantages que l'utilisation du multi-processus.

Il existe un module factice sous multitraitement, qui permet aux threads Python d'utiliser diverses méthodes de multitraitement.
Il existe une classe Pool sous dummy, qui est utilisée pour implémenter le pool de threads.
Ce pool de threads a une méthode map() qui permet à tous les threads du pool de threads d'exécuter une fonction "simultanément".

Par exemple :
après avoir appris la boucle for

for i in range(10):
	print(i*i)

Cette façon d'écrire peut bien sûr obtenir le résultat, mais le code est calculé un par un, et l'efficacité n'est pas élevée. Et si vous utilisez la technologie multi-threading, laissez le code calculer le carré de plusieurs nombres en même temps, vous devez utiliser multiprocessing.dummy pour obtenir :

Exemple d'utilisation du multithread :

from multiprocessing.dummy import Pool
def cal_pow(num):
    return num*num
pool=Pool(3)
num=[x for x in range(10)]
result=pool.map(cal_pow,num)
print('{}'.format(result))

Dans le code ci-dessus, une fonction est d'abord définie pour calculer le carré, puis un pool de threads avec 3 threads est initialisé. Ces trois fils sont responsables du calcul du carré des nombres 10. Celui qui termine le calcul du nombre en main en premier prendra le nombre suivant et continuera le calcul jusqu'à ce que tous les nombres soient calculés.

Dans cet exemple, la méthode map() du pool de threads prend deux paramètres, le premier paramètre est le nom de la fonction et le second paramètre est une liste. Remarque : Le premier paramètre est simplement le nom de la fonction et ne peut pas être entre parenthèses . Le deuxième paramètre est un objet itérable, et chaque élément de l'objet itérable sera reçu en tant que paramètre par la fonction clac_power2(). En plus des listes, des tuples, des ensembles ou des dictionnaires peuvent être utilisés comme deuxième argument de map().

5.1.3 Développement d'un robot d'exploration multithread

Étant donné que le robot d'exploration est une opération gourmande en E/S, en particulier lors de la demande du code source d'une page Web, si un seul thread est utilisé pour le développement, cela fera perdre beaucoup de temps à attendre le retour de la page Web, donc en appliquant le multi-threading la technologie au crawler peut grandement améliorer l'efficacité du crawler. Par exemple. Il faut 50 minutes à la machine à laver pour laver les vêtements, 15 minutes à la bouilloire pour faire bouillir de l'eau et 1 heure pour mémoriser les mots. Si vous attendez que la machine à laver lave d'abord les vêtements, puis faites bouillir l'eau après le lavage des vêtements, puis récitez les mots une fois l'eau bouillie, cela prendra un total de 125 minutes.

Mais si vous le regardez d'une autre manière, d'un point de vue holistique, 3 choses peuvent fonctionner en même temps. Supposons que vous vous sépariez soudainement en deux autres personnes, l'une d'elles est chargée de mettre les vêtements dans la machine à laver et d'attendre la machine à laver. pour finir, et l'autre est responsable de brûler de l'eau et d'attendre que l'eau bout, et il vous suffit de mémoriser les mots vous-même. Lorsque l'eau bout, le clone responsable de l'ébullition de l'eau disparaît en premier. Lorsque la machine à laver a fini de laver les vêtements, le clone responsable du linge disparaît. Enfin, vous avez mémorisé les mots par vous-même. Il ne faut que 60 minutes pour terminer 3 choses en même temps.

Bien sûr, vous constaterez sûrement que l'exemple ci-dessus n'est pas la situation réelle de la vie. En réalité, personne ne sera séparé. La situation dans la vraie vie est que lorsque les gens récitent des mots, ils se concentrent sur la mémorisation des mots ; lorsque l'eau est bouillie, la bouilloire émet un bip pour rappeler ; Il est donc bon de faire l'action correspondante lorsqu'elle est rappelée, il n'est pas nécessaire de vérifier toutes les minutes. Les deux différences ci-dessus sont en fait les différences entre les modèles asynchrones multi-threading et événementiels. Cette section concerne les opérations multithreads, et nous parlerons plus tard des frameworks de crawler qui utilisent des opérations asynchrones. Maintenant, rappelez-vous simplement que lorsque le nombre d'actions à exécuter n'est pas grand, il n'y a pas de différence de performances entre les deux méthodes, mais une fois que le nombre d'actions augmente considérablement, l'amélioration de l'efficacité du multi-threading diminuera, même pire que le simple -filetage. Et à ce moment-là, seul le fonctionnement asynchrone est la solution au problème.

Veuillez ajouter une description de l'image
Les deux morceaux de code suivants sont utilisés pour comparer les différences de performances entre le robot monothread et le robot multithread pour l'exploration de la page d'accueil bd : s, et le temps est cinq fois supérieur à celui d'un seul thread, soit environ un tiers. A partir du moment, vous pouvez également voir l'effet de 5 threads "fonctionnant en même temps". Mais cela ne signifie pas que plus le paramètre de pool de threads est grand, mieux c'est. On peut également voir à partir des résultats ci-dessus que le temps d'exécution de 5 threads est en fait un peu plus d'un cinquième du temps d'exécution d'un thread. Ce point supplémentaire est en fait le temps de changement de thread. Cela reflète également le fait que le multithreading de Python est toujours microscopiquement sériel. Par conséquent, si le pool de threads est trop grand, la surcharge causée par la commutation de threads peut annuler les gains de performances du multithreading. La taille du pool de threads doit être déterminée en fonction de la situation réelle, et il n'y a pas de données exactes. Les lecteurs peuvent définir différentes tailles à tester et à comparer dans des scénarios d'application spécifiques pour trouver les données les plus appropriées.

5.2 Algorithmes de recherche courants pour les crawlers

5.2.1 Recherche en profondeur d'abord

La classification des cours d'un site Web d'éducation en ligne doit analyser les informations sur les cours ci-dessus. À partir de la page d'accueil, le cours comporte plusieurs catégories principales, telles que Python, Node.js et Golang selon la langue. Il existe de nombreux cours dans chaque catégorie majeure, tels que crawler, Django et machine learning sous Python. Chaque cours est divisé en plusieurs heures.

Dans le cas d'une recherche en profondeur d'abord, l'itinéraire d'exploration est indiqué sur la figure (numéro de série de petit à grand)
Veuillez ajouter une description de l'image

5.2.2 Recherche étendue d'abord

La séquence est la suivante
Veuillez ajouter une description de l'image

5.2.3 Sélection de l'algorithme

Par exemple, pour explorer toutes les informations sur les restaurants et les informations de commande de chaque restaurant sur un site Web. En supposant que l'algorithme de profondeur d'abord est utilisé, vous explorez d'abord le restaurant A à partir d'un certain lien, puis explorez immédiatement les informations de commande du restaurant A. Puisqu'il y a des centaines de milliers de restaurants à travers le pays, cela peut prendre 12 heures pour les gravir tous. Le problème que cela pose est que le volume de commandes du restaurant A peut être augmenté à 8 heures du matin, tandis que le volume de commandes du restaurant B est augmenté à 20 heures. Leur volume de commandes a 12 heures de retard. Et pour les restaurants populaires, 12 heures ont le potentiel de faire une différence de plusieurs millions. Ainsi, lors de l'analyse des données, le décalage horaire de 12 heures rendra difficile la comparaison des performances de vente des deux restaurants A et B. Le nombre de restaurants a beaucoup moins changé par rapport à la taille de la commande. Donc, si vous utilisez la recherche en largeur d'abord, parcourez d'abord tous les restaurants de minuit à 12h00 le lendemain, puis concentrez-vous sur l'exploration du volume de commandes de chaque restaurant de 14h00 à 20h00 le lendemain. journée. De cette façon, la tâche d'exploration des commandes a été achevée en seulement 6 heures et la différence de volume de commandes causée par le décalage horaire a été réduite. Dans le même temps, étant donné que le magasin le récupère tous les quelques jours, cela a peu d'impact, de sorte que le nombre de demandes est également réduit, ce qui rend plus difficile la découverte des crawlers par le site Web.

Autre exemple, pour analyser l'opinion publique en temps réel, vous devez explorer Baidu Tieba. Un Tieba populaire peut avoir des dizaines de milliers de pages de messages, en supposant que les premiers messages remontent à 2010. Si la recherche en largeur est adoptée, les titres et les URL de tous les messages de cette barre de messages sont d'abord obtenus, puis chaque message est saisi en fonction de ces URL pour obtenir les informations de chaque étage. Cependant, comme il s'agit d'une opinion publique en temps réel, la publication d'il y a 7 ans n'a que peu d'importance pour l'analyse actuelle, et la chose la plus importante devrait être la nouvelle publication, de sorte que le nouveau contenu doit être saisi en premier. Comparé au contenu passé, le contenu en temps réel est le plus important. Par conséquent, pour l'exploration du contenu de la barre de publication, la recherche en profondeur doit être utilisée. Lorsque vous voyez un poste, entrez rapidement, explorez ses informations à chaque étage et montez au poste suivant après qu'un poste a été escaladé. Bien sûr, ces deux algorithmes de recherche ne sont pas l'un ou l'autre, et doivent être sélectionnés de manière flexible en fonction de la situation réelle, et peuvent être utilisés en même temps dans de nombreux cas.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_55159605/article/details/124147908
conseillé
Classement