2015-12-20 40 views
0

我想在views.py文件中創建一個視圖函數,它在特定的時間間隔內運行,而不依賴於請求對象是否可能在django 我正在做一個簡單的項目,使用bs4,request和django抓取Web數據,到目前爲止,我能夠抓取數據並將其呈現給我的django views.py。如何在django中的views.py文件中定義視圖函數

從不同的網站抓取的數據按照下面的格式

news_title = 'were-these-remote-wild-islands' 
news_url = 'http://bbc.co.uk/travel/see-the-dark-side-of-climate-change' 

和我的視圖函數具有下面的代碼行

from .bbc import bbc_crawler 
from .models import News 

def collect_data(request): 
    ''' 
    aggregrate all the news from each 
    news portal 
    ''' 


    allnews = [] 
    #return dict obj {'title':'climate change', 'url':'http://bbc.co.uk'}, {'title':'t', 'url':'http://url.com'} 
    allnews.append(bbc_crawler()) 

    for news in allnews: 
     for eachnews,link in news.items(): 
      #Problem is for every request the same data pushed to the database, need a solution to push the data after every 5 minutes, without depending on this function 

      News.objects.create(title=eachnews, url=link, source=source) 

    return render(request, 'news/index.html', {'allnews':allnews, 'source': source}) 

與上面的代碼,上述視圖功能的問題只有當我們訪問指向此urls.py文件中定義的此視圖功能的url時才運行

urls.py

from django.conf.urls import url 
from . import views 

urlpatterns = [ 
    url(r'^$', views.news, name="index"), 
] 

當我刷新該網址時,每次將相同的重複數據存儲在數據庫中。

我想要每5分鐘運行一次抓取程序的解決方案,並將抓取的數據保存到數據庫中。

我在哪裏可以在views.py文件中運行爬網程序,這樣我就可以在每5分鐘內保存數據而不需要複製數據,也不依賴於請求對象。我想每5分鐘將檢索到的數據保存在django數據庫中,

如何做到這一點,目前的問題是隻有刷新或請求頁面時才保存數據。

我保存的數據,而不依賴於所述請求對象在數據庫

+1

配置芹菜任務,從視圖中調用,並在那裏重複。 –

+0

好吧我會盡力做到這一點 – kemumaki

回答

0

首先我要你重新考慮你的設計

視圖由給予響應用戶的GET或POST請求。不用於抓取數據,您應該實現另一個獨立於視圖的功能。您的視圖應該只顯示數據庫中的最後一個條目。它不應該抓取數據。

想想場景: 假設我們解決了您的及時執行問題,用戶1發送一個GET請求,它將抓取數據並將其保存到數據庫00:01。下一步行動應該是在00:06。現在,如果在User2和User3之間來回打勾00:02和00:03,並且他們發送GET請求,則新的已爬網數據將被添加到數據庫中。您應該在00:01到00:06之間有2個條目,但是由於User2和三個條目有4個條目。

所以這樣做。這是比較合適的

1.創建一個myfun.py到你的應用程序目錄:

from .bbc import bbc_crawler 
from .models import News 

def crawl_data(): 
    allnews = [] 
    allnews.append(bbc_crawler()) 
    for news in allnews: 
    for eachnews,link in news.items(): 
    News.objects.create(title=eachnews, url=link, source=source) 

2.AFTER開始你的網絡服務器明確運行此爬行。PY只是一次

python crawling.py 

寫crawling.py如下:

import time 
from myfun import crawl_data 
while(True): 
time.sleep(300) 
crawl_data()   

進入您的視圖只是顯示在數據庫中任意數量的用戶的最後一個條目:

def collect_data(request); 
lastentry=News.objects.all().last() 
allnews=lastentry.allnews #Fetch acoording to your model fields 
source=lastentry.source #Fetch acoording to your model fields 
return render(request, 'news/index.html', {'allnews':allnews, 'source': source}) 
+0

是的,這將是一件好事 – kemumaki

0

視圖是用於回答該請求。如果您需要按間隔進行爬網,您應該按照@Rohit Jain的建議配置一個芹菜任務 - 或者用於一些簡單的東西 - 從cron或supervisor調用的管理命令中,保存抓取到數據庫中的數據,然後從視圖。

相關問題