2010-01-25 9 views
5

Je veux télécharger des pages Web en un seul site. Il y a 5000000 liens d'URL dans mon fichier 'urls.txt'. C'est environ 300M. Comment faire un lien multi-threads ces URLs et télécharger ces pages Web? ou Comment lot télécharger ces pages Web?Python, multi-threads, récupérer des pages Web, télécharger des pages Web

mes idées:

with open('urls.txt','r') as f: 
    for el in f: 
     ##fetch these urls 

ou tordues?

Y at-il une bonne solution pour cela?

+2

Voulez-vous programmer vous-même? Vous pouvez le faire avec 'wget' facilement. – notnoop

Répondre

1

Le téléchargement définitif de 5 millions de pages Web en une seule fois n'est pas une bonne idée, car vous pouvez exploiter un maximum de choses, y compris votre bande passante réseau et les descripteurs de fichiers de votre système d'exploitation. J'irais en lots de 100-1000. Vous pouvez utiliser urllib.urlopen pour obtenir un socket, puis read() sur plusieurs threads. Vous pourrez peut-être utiliser select.select. Si oui, alors allez-y et téléchargez tous les 1000 à la fois et distribuez chaque handle de fichier que select renvoie à dire 10 threads de travail. Si la sélection ne fonctionne pas, limitez vos lots à 100 téléchargements et utilisez un fil par téléchargement. Certes, vous ne devriez pas démarrer plus de 100 threads que votre système d'exploitation pourrait exploser ou au moins aller un peu lent.

3

Si cela ne fait pas partie d'un programme plus vaste, l'idée de notnoop d'utiliser un outil existant pour y parvenir est plutôt bonne. Si une boucle shell invoquant wget résout votre problème, cela sera beaucoup plus facile que tout ce qui implique un développement logiciel plus personnalisé. Cependant, si vous avez besoin de récupérer ces ressources dans le cadre d'un programme plus volumineux, le faire avec shell ne sera peut-être pas idéal. Dans ce cas, je recommande fortement Twisted, ce qui facilitera le traitement de nombreuses requêtes en parallèle.

Il y a quelques années, j'ai écrit un exemple de comment faire exactement cela. Jetez un oeil à http://jcalderone.livejournal.com/24285.html.

+0

merci :) C'est génial! – bell007

1

Commencez par analyser votre fichier et insérez les URL dans une file d'attente, puis générez 5 à 10 threads de travail pour extraire les URL de la file d'attente et les télécharger. Les files d'attente sont votre ami avec ceci.

+0

merci! "Les files d'attente sont ton ami avec ça." :) – bell007

0

Un script wget est probablement plus simple, mais si vous êtes à la recherche d'une solution de rampement python-twisted, consultez scrapy