Django,剪贴:在剪贴时检测“更改”的最佳方法是什么?

时间:2018-07-17 10:24:39

标签: python django web-scraping

这不是典型的 code 问题,而是我现在面临的设计问题。


比方说,我有一个网页(不是我的),我想剪贴一些信息。对我来说,最重要的信息是何时(日期时间)字符登录何时注销,但是我收集其他信息好。从点 2 (见下文)可以知道登录,但是我必须计算登出 我可以访问2页:

  1. http:// x /online.php-它为我提供了 online 昵称列表(200-500个条目)
  2. http:// x /character.php?name= 昵称-它为我提供了每个昵称的详细信息,例如:角色名称,公会,性别,等级,职业(职业),状态(离线/在线),上次登录。

我仅在task.py中执行2次“操作”,即:

  • A -使用来自“ 2”点的信息 update_or_create
  • B -获取在线列表-使用来自“ 1”点的信息

现在,它是如何工作的(每分钟,感谢Celery,我做到了):

  • 将交易自动提交设置为False
  • 对具有登录注册表但没有注销 (从数据库点来看,它们仍然是“在线”)的字符执行A操作
  • 如果此时角色的状态为“ OFFLINE”,则将数据库条目作为datetime.now添加到注销
  • 对列表B中的字符执行A
  • 提交并设置事务自动提交为True

问题是,我不确定这是否是个好主意。 我的 models.py :(评论只是为了澄清我在做什么)

class Guild:
     name = models.CharField(max_length=100)

class Player(models.Model):
    #FK:
    guild =  models.CharField(max_length=50, null=True, blank=True) # Does he have guild?
    name = models.CharField(max_length=100, unique=True) 
    sex = models.CharField(choices=SEX_CHOICES, max_length=7) # Male / Female
    level = models.PositiveSmallIntegerField() 
    vocation = models.CharField(choices=VOCATION_CHOICES, max_length=50) # His class
    status = models.CharField(choices=ONLINE_CHOICES, max_length=10) # Offline / Online
    lastlogin = models.DateTimeField() 

    def __str__(self):
        return self.name


class Deaths(models.Model):
    text = models.CharField(max_length=500)
    killed = models.ForeignKey(Player, null=True, on_delete=models.CASCADE, related_name='killed') # Who got killed
    killer = models.ForeignKey(Player, null=True, on_delete=models.CASCADE, related_name='killer') # Who killed him

    date = models.DateTimeField() # When he died?
    level = models.PositiveSmallIntegerField() # On which level player died
    pvp = models.BooleanField() # Death was due to PvP or PvE?

    class Meta:
        ordering = ('date',)


class OnlineDetails(models.Model):
    player = models.ForeignKey(Player, on_delete=models.CASCADE)

    login = models.DateTimeField() # When he logged in
    logout = models.DateTimeField(null=True, blank=True) # When he logged off

    def __str__(self):
        return self.player.name + " " + str(self.logout) if self.logout else self.player.name

    class Meta:
        ordering = ('logout', 'login')

它有效,但是我想知道这是否是最好的方法。实际上,我认为这种方式很不好,因为我必须在一分钟内扫描约500个字符,这很难用“ antyddos”屏蔽罩来完成。

您有什么更好的解决方案或技术可以选择吗? 我在python和django方面都不擅长,还在学习。

1 个答案:

答案 0 :(得分:1)

可以肯定的是,您可以衡量整个过程,所需的时间等,但是我认为更新〜500个条目只需几毫秒。更大的问题可能是每分钟废弃500个条目,这意味着您必须每秒向它们发送大约8个请求(基于第2点,而不是第1点)。我认为您正在废弃第1点。每分钟更改一次,您就会丢失丢失的字符。点1根本不是问题。解析这么多页面可能很困难,但并非没有可能。另外,我建议您下载页面并将其存储一段时间,如果在此过程中出现任何故障,则下载页面更快,并且在其他线程中并行解析它们,因为最困难的时间是发送请求并下载响应。对于事务自动提交,可能是多线程环境中的问题。如果值得冒不知道发生了什么的风险,则应尝试评估是否有此过程。