2016-06-03 3 views
1

Zuerst bin ich ein Neuling, ich bin noch neu zu Python und Django und ich habe gerade erst experimentiert mit dem Scraping meiner Daten und Speicherung in Meine Datenbank Ich muss es irgendwie arbeiten lassen. Es kratzt nur ein Objekt und speichert es. nicht mehrere Objekte. Im Moment entwickle ich mich lokal und versuche es herauszufinden. Ich habe es in einer Ansicht wie dieseGerade gelernt, Daten zu kratzen und in meiner Datenbank zu speichern, aber es nur ein Objekt kratzt

def practice(request): 
    world = get_world_too() 

    for entry in world: 
     post = Post() 
     post.title = entry['text'] 
     post.image_url = entry['src'] 
     post.save() 

     template = "blog/post/noindex.html" 
     context = { 
     } 
     return render(request, template, context) 

und dies ist die Funktion

 def get_world_too(): 
     url = 'http://www.example.org' 
     html = requests.get(url, headers=headers) 
     soup = BeautifulSoup(html.text, 'html5lib') 

     titles = soup.find_all('section', 'box')[:9] 
     entries = [{'href': url + box.a.get('href'), 
        'src': box.img.get('src'), 
        'text': box.strong.a.text, 
        } for box in titles] 
     return entries 

es nur Schrammen und speichert mehrere Objekte Wenn ich die Seite aktualisieren. Aber meine Funktion ist auf 9 gesetzt, also dachte ich, dass mindestens neun Objekte in meiner Datenbank gespeichert wären. und in der Ansicht habe ich eine Schleife

for entry in world: 
     post = Post() 
     post.title = entry['text'] 
     post.image_url = entry['src'] 
     post.save() 

also sollte nicht die Schleife alle neun der Objekte bekommen? Auch ich nicht, das ist nicht der professionelle Weg, dies zu tun. Während ich sitze, übe ich einfach damit. Letztendlich möchte ich dies als einen Heroku Cron-Job einrichten, den ich den ganzen Tag über mehrmals ausführen werde. Aber im Moment Wie kann ich das erreichen, um mehr als eines der Objekte in einem Schuss zu kratzen und es in meinem db zu speichern.

Antwort

1

Es geht nur durch die Schleife einmal wegen dieser Zeile:

return render(request, template, context)

return kehrt aus der ganzen Funktion insgesamt das erste Mal (in der ersten Schleife) läuft wird. Wenn Sie durch jede Schleife gehen wollen dann zurück, bewegen Sie die return aus der Schleife wie:

def practice(request): 
    world = get_world_too() 

    for entry in world: 
     post = Post() 
     post.title = entry['text'] 
     post.image_url = entry['src'] 
     post.save() 

     template = "blog/post/noindex.html" 
     context = {} 

    # not in the loop anymore 
    return render(request, template, context) 
+0

dieser Vorschlag behoben. Dieser Fehler lässt mich denken, dass ich die Schleife in meine Funktion aufnehmen sollte. Ich hätte diese Einrückung wahrscheinlich eingefangen und es wäre sauberer. Vielen Dank – losee