2010-02-09 7 views

Répondre

1

J'ai fait beaucoup de scraping force brute avec PHP et le traitement séquentiel semble être bien. Je ne suis pas sûr que "ce qui est long" pour vous, mais je fais souvent d'autres choses pendant qu'il gratte.

Typiquement rien ne dépend de mon grattage en temps réel, c'est les données qui comptent, et je gratte habituellement et masser en même temps.

D'autres fois, je vais utiliser une commande astucieuse wget pour abattre un site et enregistrer localement. Ensuite, ayez un script PHP avec de la magie regex pour extraire les données.

J'utilise curl_ * en PHP et ça marche très bien.

Vous pourriez avoir un travail parent qui forge des processus fils en leur fournissant des URL à gratter, qu'ils traitent et enregistrent les données localement (db, fs, etc.). Le parent est responsable de s'assurer que la même URL n'est pas traitée deux fois et que les enfants ne se bloquent pas. Facile à faire sur linux (pcntl_, fork, etc), plus dur sur les boîtes de fenêtres.

Vous pouvez également ajouter une logique pour regarder la dernière modification et (que vous avez précédemment stocké) et ignorer la page si le contenu n'a pas changé ou vous l'avez déjà. Il y a probablement un tas de trucs d'optimisation comme ça que vous pourriez faire.

+0

Yep forking semble être la meilleure option pour moi. – Tim

0

Si vous utilisez correctement cURL avec curl_multi_add_handle et curl_multi_select, vous ne pouvez pas faire grand-chose. Vous pouvez tester pour trouver un nombre optimal de poignées à traiter pour votre système. Trop peu et vous laisserez votre bande passante inutilisée, trop et vous perdrez trop de temps à changer de poignées.

Vous pouvez essayer d'utiliser le modèle multi-processus maître-agent pour que plusieurs instances de script s'exécutent en parallèle, chacune utilisant cURL pour extraire et traiter ultérieurement un bloc de pages. Les frameworks comme http://gearman.org/?id=gearman_php_extension peuvent aider à créer une solution élégante, mais l'utilisation de fonctions de contrôle de processus sous Unix ou l'appel de votre script en arrière-plan (via le shell système ou via un HTTP non bloquant) peut également fonctionner correctement.

Questions connexes