6
votes

Écrire une araignée Python plus rapide

J'écris une araignée à Python pour crawler un site. Le problème est que je dois examiner environ 2,5 millions de pages, afin que je puisse vraiment utiliser une aide d'aide à la rendre optimisée pour la vitesse.

Ce que je dois faire est d'examiner les pages d'un certain nombre et s'il est trouvé d'enregistrer le lien vers la page. L'araignée est très simple, elle doit simplement trier de nombreuses pages.

Je suis complètement nouveau à Python, mais j'ai utilisé Java et C ++ avant. Je n'ai pas encore de commencer à le coder, de sorte que toute recommandation sur les bibliothèques ou les cadres à inclure serait formidable. Toute astuces d'optimisation est également grandement appréciée.


1 commentaires

Votre meilleur pari pour rendre le processus plus rapide est d'améliorer la vitesse de votre connexion. Ce sera votre goulot d'étranglement, pas de vitesse python.


6 Réponses :


10
votes

Vous pouvez utiliser Mapreduce comme Google, soit via hadoop (spécifiquement avec python: 1 et 2 ) , disco ou Happy .

La ligne de pensée traditionnelle, écrit votre programme dans Standard Python, si vous trouvez que c'est trop lent, profiler et optimiser les points lents spécifiques. Vous pouvez faire de ces points lents plus rapidement en laissant tomber sur C, en utilisant C / C ++ Extensions ou même CTTPES .

Si vous arrachez un seul site, envisagez d'utiliser wget -r ( un exemple ).


5 commentaires

Wget supporte-t-il uniquement la récupération du HTML? Je ne veux pas être plus d'un drain que je dois.


YeP, le drapeau -A sur wget vous permet de spécifier les extensions acceptées et -r Spécifiez-vous les extensions rejetées. Donc, vous pouvez faire quelque chose comme wget -r.gif, .jpg -r exemple.com


Un wget avec C ++ / C # sera-t-il plus rapide (s'il est multi-fileté) que l'équivalent de Python?


La partie la plus lente du programme va être les connexions réseau. Chaque connexion va être d'au moins 100 ms et passer de Python à C / C ++ ne va pas se raser quelques millisecondes. Dans le grand schéma des choses, Python sera tout aussi rapide.


+1 pour wget - et si vous vérifiez votre propre site Web sur votre propre serveur, Wget pourrait réellement être mesurablement plus rapide



3
votes

Spidering Sonbody's Site avec des millions de demandes n'est pas très polie. Pouvez-vous plutôt demander au webmaster pour une archive du site? Une fois que vous avez cela, c'est une simple question de recherche de texte.


1 commentaires

Le site Web n'est pas en anglais, et je ne parle pas la langue à poser. En outre, il s'agit d'un site d'image de trafic très élevé (une autre raison pour laquelle je ne peux pas vraiment demander) et je n'ai besoin que du code HTML de chaque page, j'espère que je ne serai pas un drain sur leurs serveurs. Je prévois seulement d'arracher chaque page une fois et de ne jamais revenir pour les mises à jour.



5
votes

Où stockez-vous les résultats? Vous pouvez utiliser bibliothèque en nuage Picloud pour paralléser votre raclage facilement sur un groupe de serveurs.


2 commentaires

J'ai juste une station de travail avec un petit tableau RAID et les ordinateurs de quelques volontaires. Je prévois uniquement de stocker certaines des pages qui ont le terme de recherche pertinent, qui devrait être <1%


Moins les données pour stocker le mieux. Si vous vous trouvez besoin de plus de puissance de calcul (le parallélisme accélérera grandement ce que vous faites), essayez définitivement Picloud.



3
votes

Vous gaspillez beaucoup de temps en attente des demandes de réseau lorsqu'ils sont spidés. Vous voudrez donc certainement faire vos demandes en parallèle. Je sauverrais probablement les données de résultat sur le disque et ensuite avoir une seconde boucle de processus sur les fichiers à la recherche du terme. Cette phase pourrait facilement être distribuée sur plusieurs machines si vous aviez besoin de performances supplémentaires.


0 commentaires

5
votes

Comme vous êtes nouveau à Python, je pense que ce qui suit peut être utile pour vous :)

  • Si vous écrivez RegEx pour rechercher certains motifs de la page, compilez votre regex où que vous puissiez et réutilisez l'objet compilé
  • beauxoup est un analyseur HTML / XML pouvant être utile pour votre projet.

1 commentaires

Correction d'une partie de la mise en forme de votre message, espérons que cela ne vous dérange pas :) Bienvenue pour!



0
votes

Qu'est-ce que Adam a dit. Je l'ai fait une fois pour cartographier le réseau de Xanga. La façon dont je l'ai rendue plus rapide est d'avoir un ensemble de fil-coffre-fort contenant tous les noms d'utilisateur que je devais lever les yeux. Ensuite, j'avais 5 files de discussion à la fois et à les traiter. Vous allez passer beaucoup plus de temps à attendre la page à DL que vous ne traiterez aucun du texte (le plus probable), alors trouver simplement des moyens d'augmenter le nombre de demandes que vous pouvez obtenir en même temps.


0 commentaires