Comment faire pour automatiser plusieurs demandes pour une recherche sur le web formulaire à l'aide de R
Je suis en train d'apprendre à utiliser RCurl (ou une autre package R si je me trompe sur RCurl être le bon outil) pour automatiser le processus de présentation des termes de recherche à un formulaire web et en plaçant les résultats de la recherche dans un fichier de données. Le problème, je travaille sur est comme suit:
J'ai un fichier de données donnant numéro de plaque d'immatriculation (IAA) et numéro d'identification du véhicule (NIV) pour plusieurs voitures. Le California Department of Motor vehicles (DMV) a une page web formulaire de recherche où vous entrez dans les IAA et les cinq derniers chiffres du VIN, et il renvoie les droits d'immatriculation des véhicules (TBF) de paiement, soit en 2010 ou en 2009 (il y a un sélecteur pour que sur le formulaire de saisie). (Pour info: C'est pour un projet de recherche visant à examiner la répartition des VLF paiements par véhicule, la marque, le modèle et l'année de modèle)
Je pouvais passer par le processus fastidieux d'entrer manuellement les données pour chaque véhicule, puis en tapant manuellement le résultat dans une feuille de calcul. Mais c'est le 21ème Siècle et je voudrais l'essayer et d'automatiser le processus. Je veux écrire un script qui va présenter chacun des IAA et du VIN à la PRÉFECTURE de formulaire web, puis mettre le résultat (VLF de paiement) dans une nouvelle VLF variable dans mon fichier de données, faire cela à plusieurs reprises jusqu'à ce qu'il arrive à la fin de la liste des Iaa et les VINs. (La DMV formulaire web est ici, par le moyen:
https://www.dmv.ca.gov/FeeCalculatorWeb/vlfForm.do).
Mon plan était d'utiliser getHTMLFormDescription() (dans le RHTMLForms package) pour trouver les noms des champs de saisie, puis utiliser getForm() ou postForm() (dans le RCurl package) pour récupérer la sortie. Malheureusement, je suis bloqué à la première étape. Voici le R de la commande que j'ai utilisé et la sortie:
> forms = getHTMLFormDescription("https://www.dmv.ca.gov/FeeCalculatorWeb/vlfForm.do")
Error in htmlParse(url, ...) :
File https://www.dmv.ca.gov/FeeCalculatorWeb/vlfForm.do does not exist
Malheureusement, étant relativement nouveau à la R et presque complètement nouveau pour HTTP et web de grattage, je ne sais pas quoi faire ensuite.
D'abord, personne ne sait pourquoi je me fais une erreur sur mon getHTMLFormDescription() appel? Sinon, est-il une autre façon de voir les noms des champs de saisie?
Deuxième, pouvez-vous proposer un exemple de code pour m'aider à obtenir commencé sur la réalité de la soumettre les Iaa et les VINs et de les récupérer à la sortie? Est getForm() ou postForm() la bonne approche ou je dois faire autre chose? Si ce serait bien d'avoir quelques vrais IAA-VIN combinaisons de soumettre, d'ici trois:
IAA VIN
5MXH018 30135
4TOL562 74735
5CWR968 11802
Enfin, puisque vous pouvez le voir, je suis un débutant complet à cela, avez-vous des suggestions sur ce que j'ai besoin d'apprendre afin de devenir adepte de web scraping de ce genre et comment aller de l'apprentissage (dans R ou dans une autre langue)? Des suggestions de sites web, des livres, des listes de diffusion, d'autres StackOverflow questions, etc. serait génial.
Merci pour votre aide.
La page donne un message d'erreur pour moi avec les codes ci-dessus. Mais un conseil: vérifiez
http://www.dmv.ca.gov/wasapp/FeeCalculatorWeb/vlfFees.do?method=calculateVlf&submit=Determine%20VLF&vehicleLicense=5CWR968&vehicleTaxYear=2010&vehicleVin=11802
Merci! Pour référence future, comment comprendre cela? Aussi, si j'utilise l'url que vous avez fournies et de la fonction getURL(url), il renvoie le code html de la page donnant la sortie que je veux. Pouvez-vous suggérer un bon tutoriel sur la façon d'utiliser R pour sélectionner le texte souhaité (dans ce cas, la valeur du montant du paiement) d'un désordre de html (oui, je suis en effet totalement nouvelle à ce sujet)?
juste Google pour
readHTMLTable
ou consultez le manuel (?readHTMLTable
). Aussi, RCurl
pourrait être vraiment utile en plus de XML
paquet, et aussi regarder pour rsjon
si vous traitez avec ce genre de données.OriginalL'auteur eipi10 | 2011-03-22
Vous devez vous connecter pour publier un commentaire.
Ajoutant à la suggestion faite par daroczig et Rguy, voici un petit morceau de code pour automatiser l'ensemble du processus de l'extraction de données dans un bloc de données.
return
ladata
et aussi unSys.sleep
fonction doit être appelée à la fin deget_data
la fonction ne pas déranger le serveur beaucoup.Merci de prendre le temps d'écrire ce script. Il est très utile. J'ai choisi comme la meilleure réponse. Question de suivi: avez-vous (ou @daroczig ou quelqu'un d'autre) avez des suggestions pour de bons sites web, livres, etc. pour apprendre assez sur R, HTTP, html, et les regex pour mettre ensemble des scripts de ce genre pour un site de grattage de la tâche? Oh, et pouvez-vous expliquer ce que la substance à l'intérieur de la gsub appel signifie? Merci encore.
les trucs à l'intérieur de la gsub appel supprime juste le terme ':\302\240\302\240' à partir de la colonne de noms renvoyés à partir de la page
et comme daroczig proposé, insérer un Sys.fonction de sommeil à l'intérieur de get_data de sorte que votre code ne prend pas en charge le serveur avec trop de requêtes à l'intérieur d'un court laps de temps.
OriginalL'auteur Ramnath
Juste utiliser le protocole http au lieu de https et qui devrait résoudre votre problème. Voici le résultat que vous obtenez si vous essayez cette
[[1]]
Formulaire HTML: http://search.ca.gov/search
q :[ Recherche DMV Site ]
$feeRequestForm
Formulaire HTML: http://www.dmv.ca.gov/wasapp/FeeCalculatorWeb/vlfFees.do
vehicleLicense :[ ]
vehicleTaxYear :
vehicleVin :[ ]
Voici un exemple de la façon de remplir un formulaire et obtenir un tableau de données à partir d'un compte yahoo sports page.
J'ai appliqué cette à la page web que vous avez spécifié, mais pour une raison que l'élément de formulaire VehicleTaxYear est retourné incorrecte, ce qui provoque des erreurs. Quelqu'un avec une connaissance plus approfondie des formulaires HTML serait en mesure de vous guider sur la façon de corriger de cette erreur.
Espère que cela est utile
MODIFIER. J'ai corrigé une erreur. Il devrait être
createFunction(forms[[3]])
, puisque nous nous intéressons uniquement à la troisième forme.voir mon edit. il devrait résoudre le problème. il n'est toujours pas à résoudre les problèmes pour votre page web, mais peut être utile.
OriginalL'auteur Ramnath
Les détails de mon commentaire ci-dessus:
vehicleLicense
etvehicleVin
),readHTMLTable
de XML paquet qui vous offrira une belle trame de données de l'ensemble de données requis.Donc:
Et d'obtenir les valeurs nécessaires de la table comme @Rguy suggéré ci-dessus:
Sur ce simple exemple, vous pouvez facilement écrire une boucle de la récupération de toutes les données requises, mais de ne pas être gourmand et de ne pas en boucle sans sommeil appel (voir:
Sys.sleep
). Je voudrais extraire une seule plaque à la minute, ce qui serait certainement pas déranger le serveur de beaucoup.OriginalL'auteur daroczig
Je poste comme un commentaire après le post original, mais n'ont pas assez de réputation.
J'ai utilisé l'URL que @daroczig fourni pour obtenir les données réelles qui eipi10 veut en procédant comme suit:
En bref, le readHTMLTable commande est utile pour la mise en forme du code HTML.
Je seconde eipi10 demande comment daroczig obtenu l'url.
OriginalL'auteur Rguy