Wie kann ich loop-scraping Daten für mehrere Seiten in einer website mithilfe von python und beautifulsoup4
Ich versuche, mich zu kratzen, Daten aus dem PGA.com website, um eine Tabelle aller von den Golfplätzen in den Vereinigten Staaten. In meiner CSV-Tabelle möchte ich den Namen des Golfplatzes ,der Adresse ,der Eigentumsverhältnisse ,Website , Telefonnummer. Mit diesen Daten möchte ich geocode und lege es in eine Karte und eine lokale Kopie auf meinem computer
Setzte ich Python und Schöne Soup4 meine Daten zu extrahieren. Erreicht habe ich so weit um die Daten zu extrahieren und importieren Sie Sie in eine CSV-Datei aber jetzt habe ich ein problem, Schaben, Daten aus mehreren Seiten auf der PGA-website. Ich möchte, um zu extrahieren ALLE GOLF-KURSE, aber mein script ist nur auf einer Seite möchte ich Schleife es in den Weg, dass Sie erfassen alle Daten für die Golfplätze von allen Seiten finden Sie in der PGA-Website. Es gibt über 18000 gold Kurse und 900 Seiten Daten zu erfassen
Unten angehängt ist mein Skript. Ich brauche Hilfe zum erstellen von code, der die Erfassung ALLER Daten von der PGA-website und nicht nur eine Seite sondern mehrere. Auf diese Weise wird es mir zur Verfügung stellen, mit allen Daten von gold Kurse in den Vereinigten Staaten.
Hier ist mein Skript:
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
Dieses Skript erfasst nur 20 auf einmal und ich will alles in einem script, welches Konto für 18000 Golfplätze und 900 Seiten kratzen Sie die form.
InformationsquelleAutor Gonzalo68 | 2015-06-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der PGA-website-Suche, mehrere Seiten, die url folgt dem Muster:
bedeutet dies, dass Sie Lesen können, den Inhalt der Seite, dann ändern Sie den Wert von Seite 1 und Lesen Sie die auf der nächsten Seite.... und so weiter.
Ich bin versucht, erstellen Sie eine Funktion, aber ich habe immer nur bekommen 20 Werte und nicht die Gesamtheit der Daten. irgendwelche Kommentare?
Was ich denke passiert, ist, Ihren code zu schreiben ist über die CSV-Datei jedes mal, wenn es geht. Öffnen Sie Ihre Datei mit dem append-file-Modus statt:
with open('filename', 'a') as file:
stattalso versuchte ich es wieder und es sieht aus wie die code ist nur, sich zu wiederholen und Gedanken auf, wie man über diese?
Es wiederholt sich, aber die verwendete url zum abrufen der Seite ist leicht verändert jedes mal. Ich habe benutzt, ein
string.format()
Funktion zum ändern der Seitenzahl in der url jeder iteration.InformationsquelleAutor liamdiprose
wenn du noch diesen Beitrag Lesen , können Sie versuchen, diesen code zu....
wo ist es geschrieben range(1,5) nur ändern, mit 0,bis zur letzten Seite und erhalten Sie alle details in CSV -, ich habe versucht, sehr schwer zu bekommen, Ihre Daten im richtigen format aber es ist schwer:).
InformationsquelleAutor Mr.Bones
Setzen Sie einen link zu einer einzelnen Seite, es wird nicht Durchlaufen, jeder auf seine eigene.
Seite 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"
Seite 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
Seite 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
Da läufst du für Seite 1 Sie bekommen nur 20. Müssen Sie eine Schleife erstellen, die ' ll führen Sie durch die einzelnen Seiten.
Können Sie beginnen, indem Sie eine Funktion erstellen, dass nicht eine Seite dann die Iteration der Funktion.
Direkt nach der
search?
in der url, beginnend auf Seite 2,page=1
beginnt zunehmend, bis Seite 907, wo espage=906
.InformationsquelleAutor Leb