Comment puis-je boucle en raclant les données de plusieurs pages dans un site web à l'aide de python et beautifulsoup4
Je suis en train de recueillir des données à partir de la PGA.com site web pour obtenir une table de tous les terrains de golf aux États-unis. Dans mon CSV tableau je veux inclure le Nom du terrain de golf ,l'Adresse ,la Propriété ,Site web , numéro de Téléphone. Avec ces données, je voudrais de géocodage et de le placer dans une carte, et une copie en local sur mon ordinateur
J'ai utilisé Python et Belle Soup4 pour extraire mes données. J'ai atteint jusqu'à en extraire les données et les importer dans un fichier CSV, mais je suis maintenant avoir un problème de grattage de données à partir de plusieurs pages sur le site de la PGA. Je veux extraire TOUS LES terrains de GOLF, mais mon script est limité à une seule page, je veux une boucle dans la suite qu'il s'agira de saisir toutes les données pour les terrains de golf à partir de toutes les pages du site de la PGA. Il y a environ 18000 cours de l'or et de 900 pages de capture de données
Joint ci-dessous mon script. J'ai besoin d'aide sur la création de code qui permettra de saisir TOUTES les données de la PGA site web, et pas seulement un site, mais plusieurs. De cette manière elle va me fournir avec toutes les données de l'or en cours aux Etats-unis.
Voici mon script ci-dessous:
import csv
import requests
from bs4 import BeautifulSoup
url = "http://www.pga.com/golf-courses/search?searchbox=Course+Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0"
r = requests.get(url)
soup = BeautifulSoup(r.content)
g_data1=soup.find_all("div",{"class":"views-field-nothing-1"})
g_data2=soup.find_all("div",{"class":"views-field-nothing"})
courses_list=[]
for item in g_data2:
try:
name=item.contents[1].find_all("div",{"class":"views-field-title"})[0].text
except:
name=''
try:
address1=item.contents[1].find_all("div",{"class":"views-field-address"})[0].text
except:
address1=''
try:
address2=item.contents[1].find_all("div",{"class":"views-field-city-state-zip"})[0].text
except:
address2=''
try:
website=item.contents[1].find_all("div",{"class":"views-field-website"})[0].text
except:
website=''
try:
Phonenumber=item.contents[1].find_all("div",{"class":"views-field-work-phone"})[0].text
except:
Phonenumber=''
course=[name,address1,address2,website,Phonenumber]
courses_list.append(course)
with open ('filename5.csv','wb') as file:
writer=csv.writer(file)
for row in courses_list:
writer.writerow(row)
#for item in g_data1:
#try:
#print item.contents[1].find_all("div",{"class":"views-field-counter"})[0].text
#except:
#pass
#try:
#print item.contents[1].find_all("div",{"class":"views-field-course-type"})[0].text
#except:
#pass
#for item in g_data2:
#try:
#print item.contents[1].find_all("div",{"class":"views-field-title"})[0].text
#except:
#pass
#try:
#print item.contents[1].find_all("div",{"class":"views-field-address"})[0].text
#except:
#pass
#try:
#print item.contents[1].find_all("div",{"class":"views-field-city-state-zip"})[0].text
#except:
#pass
Ce script permet de saisir seulement 20 à un moment et j'ai envie de capturer le tout dans un script qui compte pour 18000 terrains de golf et de 900 pages à gratter de la forme.
OriginalL'auteur Gonzalo68 | 2015-06-25
Vous devez vous connecter pour publier un commentaire.
De la PGA de recherche du site web ont plusieurs pages, l'url suit le modèle:
cela signifie que vous pouvez lire le contenu de la page, puis modifiez la valeur de la page de 1, et de lire la page suivante.... et ainsi de suite.
Je suis en train de créer une fonction, mais je n'obtient que 20 valeurs et non pas l'intégralité des données. tous les commentaires?
Ce que je pense qui se passe est votre code d'écriture sur le fichier CSV à chaque fois qu'il effectue une itération. Essayez d'ouvrir votre fichier avec l'ajout de fichier plutôt le mode:
with open('filename', 'a') as file:
au lieuj'ai donc essayé de nouveau et il semble que le code est juste répéter lui-même et ses pensées sur la façon d'aller à ce sujet?
Il se répète, mais l'url utilisée pour récupérer la page est légèrement modifié à chaque fois. J'ai utilisé un
string.format()
de la fonction pour changer le numéro de la page dans l'url à chaque itération.OriginalL'auteur liamdiprose
si vous lisez ce post , vous pouvez essayer ce code trop....
où il est écrit range(1,5) il suffit de changer qu'avec des 0 jusqu'à la dernière page , et vous obtiendrez tous les détails dans le format CSV, j'ai essayé très dur pour obtenir vos données dans un format approprié, mais c'est dur:).
OriginalL'auteur Mr.Bones
Vous mettez un lien vers une page en particulier, il ne va pas à parcourir chacun sur son propre.
Page 1:
url = "http://www.pga.com/golf-courses/search?searchbox=Course+Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0"
Page 2:
http://www.pga.com/golf-courses/search?page=1&searchbox=Course%20Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0
Page 907:
http://www.pga.com/golf-courses/search?page=906&searchbox=Course%20Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0
Puisque vous êtes en cours d'exécution pour la page 1, vous n'obtiendrez que des 20. Vous aurez besoin de créer une boucle qui va parcourir chaque page.
Vous pouvez commencer par créer une fonction qui ne fait qu'une page, puis itérer cette fonction.
À droite après le
search?
dans l'url, à partir de la page 2,page=1
commence à augmenter jusqu'à ce que la page 907 où il estpage=906
.OriginalL'auteur Leb