2016-06-03 4 views
-3

Ich habe eine Funktion, die Beiträge schabt und speichert in meiner Datenbank.wenn scraping mein Programm hält, weil unique = True und kratzt nicht die nicht-Duplikate

def scrape_and_store_world(): 
    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] 

    for entry in entries: 
     post = Post() 
     post.title = entry['text'] 
     post.image_url = entry['src'] 
     post.status = 'published' 
     post.save() 
    return entries 

es werden die neuesten 9 Beiträge kratzen, aber wenn ich es laufen wieder wird es Probleme verursachen mir zu sagen, dass ein Post bereits vorhanden und es wird Schaben stoppen. Ich möchte die neueste scrape und einfach über die Duplikate überspringen, ohne dass mein Programm stockt. Was ist die richtige Syntax, dass

EDIT zu tun: Die Fehlermeldung I

duplicate key value violates unique constraint "blog_post_title_adf2f203_uniq" 
DETAIL: Key (title)=(Nightclub On Wheels: NYC Uber Driver Puts On A Party For His Passengers!) already exists. 

mein models.py

class Post(models.Model): 

STATUS_CHOICES = (
    ('draft', 'Draft'), 
    ('published', 'Published'), 
) 
title = models.CharField(max_length=250, unique=True) 

mein view.py

def noindex(request): 
    scrape_and_store_world() 
    template = "blog/post/noindex.html" 
    context = { 

    } 
    return render(request, template, context) 
+0

hilft Es ist schwierig, Ihnen zu helfen, weil wir nicht Ihr Beispiel ausprobieren können, wie es ist, und Sie nicht die vollständigen Zurückverfolgungs posten. – Chris

+0

@Chris Ich habe weitere Informationen hinzugefügt. Brauche ich noch etwas? – losee

+0

Sie werden wegen dem, was ich im ersten Kommentar gesagt habe, abgelehnt. Wenn wir Ihren Code nicht auf unserer eigenen Maschine ausführen können oder der Fehler nicht sehr offensichtlich ist, ist es fast unmöglich für uns, die Antwort für Sie zu erraten. – Chris

Antwort

0

bekomme ich es dachte, Alles, was ich tun musste, war eine if-Anweisung, die die Datenbank abfragt, um zu sehen, ob es einen passenden Titel gibt, und wenn nicht, dann speichere. Heres meinen Code.

def scrape_and_store_world(): 
    url = 'http://www.worldstarhiphop.com' 
    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] 

    entries = entries.__reversed__() 

    for entry in entries: 
     post = Post() 
     post.title = entry['text'] 
     title = post.title 
     if not Post.objects.filter(title=title): 
      post.title = entry['text'] 
      post.body = entry['href'] 
      post.image_url = entry['src'] 
      post.status = 'published' 
      post.save() 

    return entries 

Ich hoffe, dass jemand

Verwandte Themen