Comment faire pour télécharger un fichier csv à l'aide de PhantomJS
Quand je suis à la navigation sur un site web à l'aide d'Un navigateur (Chrome) et quand je clique sur un lien sur le site web de l'Un, Chrome imediatelly téléchargements rapport sous forme de fichier CSV.
Quand j'ai vérifié un serveur en-têtes de réponse j'obtiens les résultats suivants:
Cache-Control:private,max-age=31536000
Connection:Keep-Alive
Content-Disposition:attachment; filename="report.csv"
Content-Encoding:gzip
Content-Language:de-DE
Content-Type:text/csv; charset=UTF-8
Date:Wed, 22 Jul 2015 12:44:30 GMT
Expires:Thu, 21 Jul 2016 12:44:30 GMT
Keep-Alive:timeout=15, max=75
Pragma:cache
Server:Apache
Transfer-Encoding:chunked
Vary:Accept-Encoding
Maintenant, je veux télécharger et analyser ce fichier à l'aide de PhantomJS. J'ai mis page
onResourceReceived
auditeur pour voir si Phantom recevra/télécharger le fichier.
clientRequests.phantomPage.onResourceReceived = function(response) {
console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response));
};
Quand je fais le Fantôme de la demande de téléchargement d'un fichier (ce est la page.open ("URL DU FICHIER")), je peux voir dans Phantom journal que le fichier est téléchargé. Voici les logs:
"contentType": "text/csv; charset=UTF-8",
"headers": {
"name": "Date",
"value": "Wed, 22 Jul 2015 12:57:41 GMT"
},
"name": "Content-Disposition",
"value": "attachment; filename=\"report.csv\"",
"status":200,"statusText":"OK"
J'ai reçu le fichier et son contenu, mais comment accéder à un fichier de données? Quand j'ai l'impression actuelle PhantomJS page
objet, je reçois le code HTML de la page et je n'en veux pas, je veux fichier CSV, j'ai besoin d'analyser à l'aide de JavaScript.
Wtf homme, si Im dire à mes collègues pour upvote chacun de mes post, j'ai plus de 600 points dans ces quelques années sur StackOverflow et d'autres réseaux. J'ai également été surpris quand j'ai vu 3 upvotes dans une heure, mais c'est bon c'est pas mal. Si vous étudier cette problématique, trop de gens sont en face du même problème et je veux ici pour voir si quelqu'un a trouvé une bonne solution.
Après avoir écrit mon commentaire, j'ai regardé ton post histoire et a trouvé qu'il est peu probable que le vote-la fraude est en jeu ici. Cependant, je trouve toujours étrange que vous avez reçu 3 upvotes en moins de 10 minutes dans de telles faible voix balises [phantomjs] et [casperjs]. Peut-être à cause de [http], mais j'ai quelque doute.
Concernant le doublon, j'ai attrapé le mauvais lien, mais il contient toujours une réponse viable à votre question, mais il est enveloppé dans CasperJS code. Je parle
page.onFileDownload
de la PhantomJS fourche.Après des jours et des jours d'enquête, ce qui est presque impossible à faire avec PhantomJS. Il y a des solutions, mais il n'y a pas si élégant. Après juste de passer 3 heures sur CasperJS, je l'ai fait, donc utilisation CasperJS non seulement en raison de ce problème, CasperJS est un peu plus intuitive et plus facile à travailler.
OriginalL'auteur MrD | 2015-07-22
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une solution pour PhantomJS. La lecture par le biais de ce discussion j'ai trouvé un jsfiddle qui télécharge une url à l'aide de jQuery ajax méthode et encode le fichier en base64.
Le fichier que je voulais à télécharger est au format texte brut (CSV) et j'ai donc supprimé le codage des fonctions. Ma page cible également déjà eu jQuery inclus donc je n'ai pas besoin de injecter jQuery dans la page cible.
Mon code suppose que vous avez déjà ouvert la page que vous souhaitez télécharger le fichier d'aide de PhantomJS, et que la page a jQuery. Dans mon cas, j'ai eu à la première connexion au site afin d'obtenir le lien de téléchargement.
download
etbase64encode
fonctions. Je suis vraiment heureux que vous avez trouvé une bonne solution, et j'espère que votre réponse sera aider d'autres personnes.Oui, malheureusement, j'ai été coincé avec PhantomJS en raison de Sélénium et de C# exigences.
Ajax ne prend pas en charge les cookies, si cette solution ne fonctionne pas sur les cookies vérifiez le serveur de scripts côté. triste :d
Cela peut aider à re cookies stackoverflow.com/questions/20953864/...
OriginalL'auteur Matthew Lock
Après des jours et des jours d'enquête, je dois dire qu'il y a des solutions:
Si vous avez besoin de télécharger un fichier à l'aide de PhanotmJS, puis exécutez loin de PhantomJS et l'utilisation CasperJS. CasperJS est basé sur PhantomJS, mais il a beaucoup mieux et intuitive de la syntaxe et de flux de programme.
Ici est bon poste en expliquant "Pourquoi CasperJS est mieux que PhantomJS". Dans ce post, vous pouvez trouver l'article sur le téléchargement de fichiers.
Comment télécharger un fichier CSV à l'aide de CasperJS (cela fonctionne même lorsque le serveur envoie l'en-tête
Content-Disposition:attachment; filename='file.csv
)Ici vous pouvez trouver quelques personnalisée fichier csv disponible pour le téléchargement: http://captaincoffee.com.au/dump/items.csv
Afin de télécharger ce fichier à l'aide de CasperJS exécuter le code suivant:
Le code ci-dessus va télécharger
http://captaincoffee.com.au/dump/csv.csv
fichier CSV et d'imprimer des résultats en base64 de la chaîne. Ainsi, de cette façon, vous n'avez même pas à télécharger les données dans un fichier, vous avez vos données en base64 de la chaîne.Si vous souhaitez explicitement pour télécharger le fichier du système de fichiers, vous pouvez utiliser
download
fonction de ce qui est disponible dans CasperJS.OriginalL'auteur MrD
Au cours des 2 dernières réponses supposent que vous pouvez connaître à l'avance l'URL de la finale de fichier CSV. Qui ne sera pas le cas si le lien mène à une page HTML qui n'Javascript est calculée rediriger vers le fichier et que vous ne voulez pas pour évaluer le Javascript en dehors de PhantomJS. Vos options sont les suivantes:
text/plain
et supprimeContent-Disposition
en-têtes, de sorte que vous pouvez lire le fichier à partir de PhantomJS de façon normale—qui doivent travailler pour un fichier CSV mais ne fonctionne pas pour les fichiers binaires avec 0 octets.La première de ces options (PhantomJS + proxy en amont) est plus facile si le proxy en amont possible de surveiller le
Accept
- tête de PhantomJS envoie vers le site distant. Au moins dans PhantomJS version 2.1.1, les principales demandes qui ontAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
, de la feuille de style de demandes deAccept: text/css,*/*;q=0.1
, et toutes les autres demandes (images, scripts, XMLHttpRequest) par défaut pourAccept: */*
bien que cela peut être modifié par les sites qui utilisentXMLHttpRequest.setRequestHeader()
. Par conséquent, si le proxy en amont voit une requête avec unAccept
d'en-tête contenanttext/html
, et en passant sur ce demande au serveur de résultats dans un fichier CSV ou autres non-document HTML, puis il ya une bonne chance c'est le seul à enregistrer.OriginalL'auteur Silas S. Brown