首先让我说我是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)
答案 0 :(得分:0)
根据HTTP请求的结果来建立模型的save()
方法实际上可能是最糟糕的想法之一(如果您不明白为什么,请问自己有多少种不同的方法会失败)。
据我了解您的问题,它有两个方面:1 /填充数据库和2 /使数据库保持最新状态(/ trasnfermrkt)。
对于第一部分(并假设您可以从trasnfermrkt链接获取所有必填字段),解决方案是编写一个自定义管理命令,该命令接受trasnfermrkt网址列表(或包含此类列表的文本文件,每个行),查询这些网址并从这些网址创建playerdata记录(当然首先要过滤掉现有记录)。
最终,根据从trasnfermrkt网站获得的信息,您甚至可以更改命令以直接从该网站抓取网址。
但是请注意:要有礼貌并在每次请求之间留出适当的等待时间,这样您才不会使网站超载...哦,是的-确保从网站的使用条款中可以,并与他们联系以寻求法律协议。
对于第二部分,类似的定制管理命令将遍历现有记录,查询url并从响应中更新记录。然后,该命令应该由某些调度程序(cron
或类似的程序)执行,就像每天执行一次一样,具体取决于这些数据的更改频率以及站点允许的内容。
由于这些命令中的大多数代码都是相同的,因此您可以将其提取到两个命令都调用的不同函数中,并且还可以在自定义ModelAdmin中使用该函数从admin中的URL本身创建新的播放器。 / p>