自动扫描 RSS 提要并填充 WebContent 模型
Automatically scan RSS feeds and populate WebContent model
我正在尝试创建一个 Django 服务器应用程序(目前在本地主机上),它将定期检查模型 Blogger
提供的给定 RSS 提要(即每小时一次),从中提取数据,然后为以下内容提供数据模型 WebContent
.
到目前为止,我已经在 http://127.0.0.1:8000/api/blogger/
创建了一个数据端点,它输出以下信息:
[
{
"id": "c384f191-662f-43f9-a39d-2da737e7cbb8",
"name": "Patricia Bright",
"avatar": "http://127.0.0.1:8000/media/img/1470305802086_IMG_5921.JPG",
"rss_url": "http://patriciabright.co.uk/?feed=rss2",
},
{
"id": "dc70ca6b-94cc-4ba9-a0c8-0d907f7ab020",
"name": "Shirley B. Eniang",
"avatar": "http://127.0.0.1:8000/media/img/1470305797487_photo.jpg",
"rss_url": "http://shirleyswardrobe.com/feed/",
}
]
现在我想遍历上面的 rss_url
值并从每个 RSS 提要中提取特定信息以为模型 WebContent
提供数据。我想每小时 运行,在填充模型之前应该检查数据是否已经存在 WebContent
(这样我就不会收到任何重复的请求)。
这是我到目前为止在 models.py
中所做的:
from uuid import uuid4
from time import time
from django.db import models
from django.contrib.contenttypes.models import ContentType
import feedparser
def get_upload_avatar_path(instance, filename):
timestamp = int(round(time() * 1000))
path = "img/%s_%s" % (timestamp, filename)
return path
class Blogger(models.Model):
"""
Blogger model
"""
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
name = models.CharField(max_length=255, null=True, default=None)
avatar = models.ImageField(upload_to=get_upload_avatar_path, blank=True, null=True, default=None, max_length=255)
url = models.CharField(max_length=255, null=True, default=None)
rss_url = models.CharField(max_length=255, null=True, default=None)
instagram_url = models.CharField(max_length=255, null=True, default=None)
twitter_url = models.CharField(max_length=255, null=True, default=None)
youtube_url = models.CharField(max_length=255, null=True, default=None)
class Meta:
verbose_name_plural = "Bloggers"
def __str__(self):
return "%s" % (self.name)
def generate_web_content(self):
"""
Scan for blogger RSS feeds and generate web content
:return: None
"""
web_content = WebContent.objects.create(user_profile=self)
self._scan_web_content(web_content)
def _scan_web_content(self, web_content=None):
"""
Scan blogger RSS feeds
:param report: Associated WebContent object
:return: None
"""
urls = Blogger.objects.all()
d = feedparser.parse(urls['rss_url'])
for post in d.entries:
blogger = self
title = post.title.encode('ascii', 'ignore')
url = post.link.encode('ascii', 'ignore')
class WebContent(models.Model):
"""
Model to store blogger web content
"""
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
blogger = models.ForeignKey(Blogger)
title = models.CharField(max_length=255, null=True, default=None)
url = models.CharField(max_length=255, null=True, default=None)
class Meta:
verbose_name_plural = "Web Content"
我已经成功地在一个单独的 python 文件中模拟了一个运行良好的实现。我想我正在尝试将其移植到我的 Django 应用程序中。
import feedparser
import json
import sys
import os
os.system('cls')
# Import json
with open('bloggers.json') as jsonfile:
j = json.load(jsonfile)
for blogger in j['bloggers']:
print (blogger['name'])
print "---------------------"
d = feedparser.parse(blogger['rssUrl'])
for post in d.entries:
print post.title.encode('ascii', 'ignore') + ": " + post.link.encode('ascii', 'ignore') + "\n"
如有任何帮助,我们将不胜感激。
你的代码好像有很多问题:
在方法 generate_web_content
中,您通过传递参数 user_profile=self
创建一个 WebContent
对象,而它应该是 blogger=self
.
在方法 _scan_web_content
中,您查询了所有 Blogger
对象,例如:
urls = Blogger.objects.all()
所以,urls
是一个查询集对象,您不能像 urls['rss_url']
那样访问密钥,而应该
d = feedparser.parse(self.rss_url)
在 for 循环中,您应该将属性添加到作为参数传递的 WebContent
对象,例如:
for post in d.entries:
web_content.blogger = self
web_content.title = post.title.encode('ascii', 'ignore')
web_content.url = post.link.encode('ascii', 'ignore')
web_content.save()
否则这个方法什么都不做。
希望它澄清!
我正在尝试创建一个 Django 服务器应用程序(目前在本地主机上),它将定期检查模型 Blogger
提供的给定 RSS 提要(即每小时一次),从中提取数据,然后为以下内容提供数据模型 WebContent
.
到目前为止,我已经在 http://127.0.0.1:8000/api/blogger/
创建了一个数据端点,它输出以下信息:
[
{
"id": "c384f191-662f-43f9-a39d-2da737e7cbb8",
"name": "Patricia Bright",
"avatar": "http://127.0.0.1:8000/media/img/1470305802086_IMG_5921.JPG",
"rss_url": "http://patriciabright.co.uk/?feed=rss2",
},
{
"id": "dc70ca6b-94cc-4ba9-a0c8-0d907f7ab020",
"name": "Shirley B. Eniang",
"avatar": "http://127.0.0.1:8000/media/img/1470305797487_photo.jpg",
"rss_url": "http://shirleyswardrobe.com/feed/",
}
]
现在我想遍历上面的 rss_url
值并从每个 RSS 提要中提取特定信息以为模型 WebContent
提供数据。我想每小时 运行,在填充模型之前应该检查数据是否已经存在 WebContent
(这样我就不会收到任何重复的请求)。
这是我到目前为止在 models.py
中所做的:
from uuid import uuid4
from time import time
from django.db import models
from django.contrib.contenttypes.models import ContentType
import feedparser
def get_upload_avatar_path(instance, filename):
timestamp = int(round(time() * 1000))
path = "img/%s_%s" % (timestamp, filename)
return path
class Blogger(models.Model):
"""
Blogger model
"""
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
name = models.CharField(max_length=255, null=True, default=None)
avatar = models.ImageField(upload_to=get_upload_avatar_path, blank=True, null=True, default=None, max_length=255)
url = models.CharField(max_length=255, null=True, default=None)
rss_url = models.CharField(max_length=255, null=True, default=None)
instagram_url = models.CharField(max_length=255, null=True, default=None)
twitter_url = models.CharField(max_length=255, null=True, default=None)
youtube_url = models.CharField(max_length=255, null=True, default=None)
class Meta:
verbose_name_plural = "Bloggers"
def __str__(self):
return "%s" % (self.name)
def generate_web_content(self):
"""
Scan for blogger RSS feeds and generate web content
:return: None
"""
web_content = WebContent.objects.create(user_profile=self)
self._scan_web_content(web_content)
def _scan_web_content(self, web_content=None):
"""
Scan blogger RSS feeds
:param report: Associated WebContent object
:return: None
"""
urls = Blogger.objects.all()
d = feedparser.parse(urls['rss_url'])
for post in d.entries:
blogger = self
title = post.title.encode('ascii', 'ignore')
url = post.link.encode('ascii', 'ignore')
class WebContent(models.Model):
"""
Model to store blogger web content
"""
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
blogger = models.ForeignKey(Blogger)
title = models.CharField(max_length=255, null=True, default=None)
url = models.CharField(max_length=255, null=True, default=None)
class Meta:
verbose_name_plural = "Web Content"
我已经成功地在一个单独的 python 文件中模拟了一个运行良好的实现。我想我正在尝试将其移植到我的 Django 应用程序中。
import feedparser
import json
import sys
import os
os.system('cls')
# Import json
with open('bloggers.json') as jsonfile:
j = json.load(jsonfile)
for blogger in j['bloggers']:
print (blogger['name'])
print "---------------------"
d = feedparser.parse(blogger['rssUrl'])
for post in d.entries:
print post.title.encode('ascii', 'ignore') + ": " + post.link.encode('ascii', 'ignore') + "\n"
如有任何帮助,我们将不胜感激。
你的代码好像有很多问题:
在方法
generate_web_content
中,您通过传递参数user_profile=self
创建一个WebContent
对象,而它应该是blogger=self
.在方法
_scan_web_content
中,您查询了所有Blogger
对象,例如:urls = Blogger.objects.all()
所以,
urls
是一个查询集对象,您不能像urls['rss_url']
那样访问密钥,而应该d = feedparser.parse(self.rss_url)
在 for 循环中,您应该将属性添加到作为参数传递的
WebContent
对象,例如:for post in d.entries: web_content.blogger = self web_content.title = post.title.encode('ascii', 'ignore') web_content.url = post.link.encode('ascii', 'ignore') web_content.save()
否则这个方法什么都不做。
希望它澄清!