Bonjour,
Contexte ::
Je développe actuellement un webScrapper utilisant Symfony/Panther et pilotée via une interface WEB (en symfony4) par un utilisateur car le scrap intervient en plusieurs étapes.
Chaque méthode est lancée au clic utilisateur.
Code illustratif ::
Si on prend ce simple exemple comme illustration, voici ce que j'essai de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $client =\Symfony\Component\Panther\Client::createChromeClient(); $crawler = $client->request('GET', 'http://www.wikipedia.org/'); $form = $crawler->filter('#search-form')->form(['search' => 'web scraping']); $crawler = $client->submit($form); $client->takeScreenshot('pantherScreen.png'); echo "> Wikipedia :: ".$crawler2->filter('.mw-parser-output p')->first()->text();
> initialiser le $client une bonne fois pour toute en passant l'étape de connexion (formulaire à remplir puis submit via symfony/panther)
> réutiliser le $client pour chaque action future
> 1 clic lancerait par exemple la recherche wikipedia
> 1 autre clic lancerait la prise d'un screenshot
etc...
Mon problème ::
> 1er clic :: j'initialise le $client, recupére le form, le remplit le submit et tout se passe correctement
> 2eme clic :: crash car le $client n' "existe" plus
Pour info, j'ai d'abord développé le script de scrap de A à Z, comprenant connexion, recherche, scrap des résultats, scrap d'un résultat en particulier.
Le code fonctionne donc c'est bien au moment de séparer les tâches que le soucis arrive parce que je ne garde pas le $client d'un appel à l'autre.
Mes tentatives ::
> j'ai regardé la doc du composant "process" de Symfony qui ne me semble pas suffisant à priori !?
> également regardé du coté du "WorkerThread" de la lib pThread mais qui ne semble pas compatible avec Symfony ???
Le soucis vient donc du fait que quand je recherche un moyen de faire cela sur le net, je tombe sur plein de libs, composants plus ou moins obscurs... des bouts de lib compatibles sous certaines conditions seulement, dont l'installation est trés fastidieuse etc ou alors il me manque quelque chose...
Dans le cas du process symfony qui me parraissait le plus prometteur ::
1/ il me semble que je ne peut communiquer avec mon app symfony qu'une fois celui ci terminé (auquel cas il y a perte du $client)
2/ une fois le click utilisateur réalisé et le process executé, il semble que je perde toute reference à celui-ci et meme si on peut récupérer le PID dudit process, il semble qu'on ne puisse pas retrouver ce thread grâce à son PID... ca m'a d'ailleurs trés étonné...
Voila, anciennement dev Android, ce que je cherche à faire aurait été fait en 5mn via une AsyncTask ou un WorkerThread tous deux directement fournis par le framework Android...
Mais en Web, je piétine et tourne en rond :/
Ma question ::
> Comment garder mon instance de $client après la connexion et pour tous les autres appels aux méthodes de scrap au sein d'une app symfony 4...
D'avance merci pour votre aide![]()
Partager