gpt4 book ai didi

python - Django,抓取 : What's the best way to detect "changes" while scraping?

转载 作者:行者123 更新时间:2023-12-01 09:14:27 24 4
gpt4 key购买 nike

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

<小时/>

假设我有一个网页(不是我的),并且我想抓取一些信息。对我来说,最重要的信息是何时(日期时间)角色登录何时注销,但我收集其他信息为出色地。 登录从点2已知(见下文),但注销我必须计算我可以访问 2 个页面:

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

我在tasks.py中只进行了2个“操作”,它们是:

  • A - 使用“2”点的信息update_or_create
  • B - 获取在线列表 - 使用点“1”的信息
<小时/>

所以,它现在的工作原理是(每分钟,感谢 Celery,我都会这样做):

  • 将事务自动提交设置为 False
  • 对具有登录注册表但没有注销的角色执行A(从数据库角度来看,他们仍然“在线”)
  • 如果此时角色的状态为“离线”,请将数据库条目添加到注销作为 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 方面都不是最好的,仍在学习中。

最佳答案

当然,您可以测量整个过程、需要多长时间等等,但我认为更新约 500 个条目只需几毫秒。更大的问题可能是每分钟抓取 500 个条目,这意味着您必须每秒向它们发送大约 8 个请求(基于第 2 点,而不是第 1 点)。我认为你正在抓取第一点。每一分钟并且在变化时你都会抓取丢失的字符。第 1 点根本不是问题。解析如此多的页面可能很困难,但并非不可能。另外,我建议您下载页面并将其存储一段时间,如果在此过程中出现任何失败,下载页面并在其他线程中并行解析它们会更快,因为最困难的是发送请求和下载响应。对于事务自动提交...在多线程环境中可能会出现问题。如果值得冒不知道发生了什么的风险,那么您应该尝试在有或没有它的情况下衡量该过程。

关于python - Django,抓取 : What's the best way to detect "changes" while scraping?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51379040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com