2017-09-24 33 views
2

我有一個在Django項目中抓取成千上萬個URL的爬蟲。爬行每兩小時執行一次。每秒有多個請求會降低數據庫的速度。如何在Django中使用臨時存儲器?

這是蜘蛛解析方法:

def parse(self, response): 
    httpstatus = response.status 
    url_obj = response.request.meta['url_obj'] 
    xpath = url_obj.xpath 
    elements = response.selector.xpath(xpath + '/text()').extract() 

    ... EXCEPTIONS ... 

    Scan.objects.create(url=url, httpstatus=httpstatus, 
           price=price, 
           valid=True) 

正如你所看到的,我有充分的請求後才能訪問數據庫(幾十秒鐘),但這個數據庫是由用戶使用過。而且,在整個掃描完成之前,我不能在前端使用這些Scan對象。

我的想法是爲新創建的Scan對象創建某種中介/臨時存儲,然後在掃描完成後將它們移動到主數據庫。

我該怎麼做?你有什麼想法?

+0

https://docs.djangoproject.com/en/1.11/topics/cache/#memcached –

+0

@SachinKukreja這可怎麼幫?而且,將數據保存在內存中的數據太多。你能詳細說明一下嗎? –

回答

0

您可以在列表中累積您的Scan對象,然後在準備好時將它們累積到bulk_create()。這將大大減少數據庫命中的數量。

scans = [] 

.... 

def parse(self, response): 
    httpstatus = response.status 
    url_obj = response.request.meta['url_obj'] 
    xpath = url_obj.xpath 
    elements = response.selector.xpath(xpath + '/text()').extract() 

    ... EXCEPTIONS ... 

    scans.append(Scan(url=url, httpstatus=httpstatus, 
          price=price, 
          valid=True)) 

.... 

Scan.objects.bulk_create(scans)