如何用互联网数据填充模型属性

时间:2019-07-16 11:17:36

标签: python django python-3.x django-models

首先让我说我是Django的新手。

我创建了一个小型应用程序,该应用程序从trasnfermrkt收集信息以创建足球运动员。

在我的模型中,我为播放器定义了一些属性:名称,年龄,位置...属性之一是trasnfermrkt URL链接。我想添加URL和应用程序,以使用该URL中的信息自动填充所有属性。

从transfermrkt收集信息的函数不是模型的一部分(我正在尝试遵循服务模块的方法),因此,从模型中,我正在修改save方法以调用外部函数。

到目前为止,这种方法是可行的,但是我想知道是否有一种更好的方法可以实现我想要的目标(也许使用信号?)。

scrapping.py

class PlayerData():
  """Class that gathers data from transfermrkt. It needs a URL"""
  headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}

  def get_transfrmrkt(self):
    page = self
    pageTree = requests.get(page, headers=PlayerData.headers)
    soup = BeautifulSoup(pageTree.content, 'html.parser')
    player_name = soup.find("div", class_="dataMain").find("h1").text
[...]

models.py

from library.scrapping import PlayerData 
[...]
  def save(self, *args, **kwargs):
    self.name=PlayerData.get_transfrmrkt(self.transfermarkt_link)
    # Call the "real" save()
    super(Player, self).save(*args, **kwargs)

1 个答案:

答案 0 :(得分:0)

根据HTTP请求的结果来建立模型的save()方法实际上可能是最糟糕的想法之一(如果您不明白为什么,请问自己有多少种不同的方法会失败)。

据我了解您的问题,它有两个方面:1 /填充数据库和2 /使数据库保持最新状态(/ trasnfermrkt)。

对于第一部分(并假设您可以从trasnfermrkt链接获取所有必填字段),解决方案是编写一个自定义管理命令,该命令接受trasnfermrkt网址列表(或包含此类列表的文本文件,每个行),查询这些网址并从这些网址创建playerdata记录(当然首先要过滤掉现有记录)。

最终,根据从trasnfermrkt网站获得的信息,您甚至可以更改命令以直接从该网站抓取网址。

但是请注意:要有礼貌并在每次请求之间留出适当的等待时间,这样您才不会使网站超载...哦,是的-确保从网站的使用条款中可以,并与他们联系以寻求法律协议。

对于第二部分,类似的定制管理命令将遍历现有记录,查询url并从响应中更新记录。然后,该命令应该由某些调度程序(cron或类似的程序)执行,就像每天执行一次一样,具体取决于这些数据的更改频率以及站点允许的内容。

由于这些命令中的大多数代码都是相同的,因此您可以将其提取到两个命令都调用的不同函数中,并且还可以在自定义ModelAdmin中使用该函数从admin中的URL本身创建新的播放器。 / p>