2016-07-07 7 views
0

Ich muss zum nächsten URL - Link (jede Seite hat etwa 20 Zeilen, die ich extrahieren muss, gefolgt von denen die gleiche muss die nächste Reihe von Ergebnissen aus der hinzugefügt werden folgenden URLs).Kann nicht mehrere Seiten durchlaufen, um Daten zu scratzen

Es gibt ungefähr 360 URLs und ich möchte Daten extrahieren, indem ich alle durchlaufe. Mein Code ist unten. Ich möchte sie später in eine CSV-Datei schreiben. Irgendwelche Vorschläge würden sehr geschätzt werden, da ich Python neu bin.

 from urlparse import urljoin 
    import requests 
    from bs4 import BeautifulSoup 
    import csv 

    base_url = 'http://cricket.inhs.uiuc.edu/edwipweb/FMPro?-db=nvpassoc.fp5&-format=nvp_search_results.htm&-lay=web%20form&-max=20&-findall=' 
    list_of_rows = [] 

    next_page = 'http://cricket.inhs.uiuc.edu/edwipweb/FMPro?-db=nvpassoc.fp5&-format=nvp_search_results.htm&-lay=web%20form&-max=20&-skip=20&-findall=' 

    while True: 
     soup = BeautifulSoup(requests.get(next_page).content) 
     soup.findAll('table')[1].findAll('tr') 
      for row in soup.findAll('table')[1].findAll('tr'): 
      list_of_cells = [] 
       for cell in row.findAll('p'): 
       text = cell.text.replace(' ','') 
       list_of_cells.append(text) 
      list_of_rows.append(list_of_cells) 

    try: 
     next_page = urljoin(base_url, soup.select('/FMPro?-db=nvpassoc.fp5&-format=nvp_search_results.htm&-lay=web%20form&-max=20&-skip=20&-findall=')[1].get('href')) 
    except IndexError: 
    break 


    print list_of_rows 

    outfile = open("./trialpage.csv","wb") 
    writer = csv.writer(outfile) 
    writer.writerows(list_of_rows) 
+0

Sie müssen Ihren Versuchs-/ausgenommenblock innerhalb Ihrer while-Schleife setzen. Sie müssen auch die next_page jedes Mal aktualisieren, wenn Sie die max ändern und die Werte überspringen –

+0

Sie befindet sich innerhalb der while-Schleife. Das Problem, das ich habe, ist, dass es nur die ersten 20 Zeilen auf einer Seite druckt und nicht auf die nächste Webseite geht. –

+0

Es ist nicht in Ihrer While-Schleife. Bewege es unter die for-Schleife –

Antwort

0

Ich habe einige Änderungen an Ihrem Code vorgenommen. Ich habe die ursprüngliche URL mit einer Variablen namens Skip eingerichtet. überspringen wird um 20 jedes Mal durch

from urlparse import urljoin 
import requests 
from bs4 import BeautifulSoup 
import csv 

list_of_rows = [] 

skip = 0 
next_page = 'http://cricket.inhs.uiuc.edu/edwipweb/FMPro?-db=nvpassoc.fp5&-format=nvp_search_results.htm&-lay=web%20form&-max=20&-skip=' + str(skip) + '&-findall=' 
print next_page 
while True: 
    soup = BeautifulSoup(requests.get(next_page).content) 
    soup.findAll('table')[1].findAll('tr') 
    for row in soup.findAll('table')[1].findAll('tr'): 
     list_of_cells = [] 
     for cell in row.findAll('p'): 
      text = cell.text.replace(' ','') 
      list_of_cells.append(text) 
     list_of_rows.append(list_of_cells) 

    try: 
     skip += 20 
     if skip > 300: 
      break 
     next_page = 'http://cricket.inhs.uiuc.edu/edwipweb/FMPro?-db=nvpassoc.fp5&-format=nvp_search_results.htm&-lay=web%20form&-max=20&-skip=' + str(skip) + '&-findall=' 
     print next_page 
    except IndexError as e: 
     print e 
     break 


# print list_of_rows 

outfile = open("./trialpage.csv","wb") 
writer = csv.writer(outfile) 
writer.writerows(list_of_rows) 

Sie erhöht werden könnte, größere Brocken nehmen, da Sie nicht durch Bildschirmansicht begrenzt sind, und ich denke, es ist schneller funktionieren würde. Versuchen Sie Max = 200, und dann schreitet Schritt um 200 fort

+0

Danke @joel. Sobald es die letzte Seite erreicht, bleibt der Code immer noch in Schleifen und die letzte Seite wird für immer wiederholt. Anyway in dem ich den Max-Skip einstellen kann um zu stoppen? –

+0

Das habe ich selbst bemerkt. Ich schlage vor, dass Sie manuell auf die Seite zugreifen und etwas herausfinden, das ein Ende Ihrer Sammlung auslösen würde. Siehe meine Bearbeitung zu Code –

+0

Großartig, das funktioniert. Jeder der Datensätze, die das Skript abreibt, wird jedoch grundsätzlich sieben Mal wiederholt (was der Anzahl der Spalten in dieser Übung entspricht). –

Verwandte Themen