Ich versuche herauszufinden, wie meine App eine Funktion verwenden, die Websites im Hintergrund scrappt, weil es eine lange Zeit dauert und einen Fehler verursacht, wenn ran im Vordergrund. Also folgte ich dem Tutorial auf Herokus Seite mit einer Funktion, die Wörter zählt und im Hintergrund läuft. Es klappt. Also war ich bereit, meine Funktion zunächst über den Import dorthin zu bringen. Also habe ich es importiert und eine Funktion erstellt, die es benutzt. Ich habe diese ZurückverfolgungsWie kann ich meine Django App automatisch im Hintergrund auf Heroku kratzen
Traceback (most recent call last):
File "my_raddqueue.py", line 2, in <module>
from src.blog.my_task import conn, is_page_ok
File "/Users/ray/Desktop/myheroku/practice/src/blog/my_task.py", line 5, in <module>
from .my_scraps import p_panties
File "/Users/ray/Desktop/myheroku/practice/src/blog/my_scraps.py", line 3, in <module>
from .models import Post
File "/Users/ray/Desktop/myheroku/practice/src/blog/models.py", line 3, in <module>
from taggit.managers import TaggableManager
File "/Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/taggit/managers.py", line 7, in <module>
from django.contrib.contenttypes.models import ContentType
File "/Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/django/contrib/contenttypes/models.py", line 159, in <module>
class ContentType(models.Model):
File "/Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/django/contrib/contenttypes/models.py", line 160, in ContentType
app_label = models.CharField(max_length=100)
File "/Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1072, in __init__
super(CharField, self).__init__(*args, **kwargs)
File "/Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 166, in __init__
self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE
File "/Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/django/conf/__init__.py", line 55, in __getattr__
self._setup(name)
File "/Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/django/conf/__init__.py", line 41, in _setup
% (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
Ich habe sogar versucht, die Funktion in my_task.py es lief zu schaffen und bekam die gleiche Zurückverfolgungs
dies ist meine Dateistruktur
unten sind die Dateien und der Code, den ich denke, ist relevant für die Reproduktion des Problems
die Funktion, die ich verwenden möchte, befindet sich in my_scraps Py
import requests
from bs4 import BeautifulSoup
from .models import Post
import random
import re
from django.contrib.auth.models import User
import os
def p_panties():
def swappo():
user_one = ' "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0" '
user_two = ' "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5)" '
user_thr = ' "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko" '
user_for = ' "Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:10.0) Gecko/20100101 Firefox/10.0" '
agent_list = [user_one, user_two, user_thr, user_for]
a = random.choice(agent_list)
return a
headers = {
"user-agent": swappo(),
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"accept-charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
"accept-encoding": "gzip,deflate,sdch",
"accept-language": "en-US,en;q=0.8",
}
pan_url = 'http://www.example.org'
shtml = requests.get(pan_url, headers=headers)
soup = BeautifulSoup(shtml.text, 'html5lib')
video_row = soup.find_all('div', {'class': 'post-start'})
name = 'pan videos'
if os.getenv('_system_name') == 'OSX':
author = User.objects.get(id=2)
else:
author = User.objects.get(id=3)
def youtube_link(url):
youtube_page = requests.get(url, headers=headers)
soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
video_row = soupdata.find_all('p')[0]
entries = [{'text': div,
} for div in video_row]
tubby = str(entries[0]['text'])
urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', tubby)
cleaned_url = urls[0].replace('?&autoplay=1', '')
return cleaned_url
def yt_id(code):
the_id = code
youtube_id = the_id.replace('https://www.youtube.com/embed/', '')
return youtube_id
def strip_hd(hd, move):
str = hd
new_hd = str.replace(move, '')
return new_hd
entries = [{'href': div.a.get('href'),
'text': strip_hd(strip_hd(div.h2.text, '– Official video HD'), '– Oficial video HD').lstrip(),
'embed': youtube_link(div.a.get('href')),
'comments': strip_hd(strip_hd(div.h2.text, '– Official video HD'), '– Oficial video HD').lstrip(),
'src': 'https://i.ytimg.com/vi/' + yt_id(youtube_link(div.a.get('href'))) + '/maxresdefault.jpg',
'name': name,
'url': div.a.get('href'),
'author': author,
'video': True
} for div in video_row][:13]
for entry in entries:
post = Post()
post.title = entry['text']
title = post.title
if not Post.objects.filter(title=title):
post.title = entry['text']
post.name = entry['name']
post.url = entry['url']
post.body = entry['comments']
post.image_url = entry['src']
post.video_path = entry['embed']
post.author = entry['author']
post.video = entry['video']
post.status = 'draft'
post.save()
post.tags.add("video", "Musica")
return entries
my_task.py
import os
import redis
from rq import Worker, Queue, Connection
from .my_scraps import p_panties
import requests
listen = ['high', 'default', 'low']
redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
conn = redis.from_url(redis_url)
if __name__ == '__main__':
with Connection(conn):
worker = Worker(map(Queue, listen))
worker.work()
def is_page_ok(url):
response = requests.get(url)
if response.status_code == 200:
return "{0} is up".format(url)
else:
return "{0} is not OK. Status {1}".format(url, response.status_code)
def do_this():
a = p_panties()
return a
my_raddqueue.py
from rq import Queue
from src.blog.my_task import conn, do_this
q = Queue('important', connection=conn)
result = q.enqueue(do_this)
print("noted")
diese Linie
from .my_scraps import p_panties
wird, dass die Rückverfolgung verursachen als gut, auch wenn ich nicht es benutzen. Nachdem ich den Versuch aufgegeben hatte, die Funktion zu verwenden, die ich versuchte zu verwenden und zu sehen, ob die andere funktionierte, taten sie es nicht und ich konnte nicht herausfinden, warum, bis ich begann, Dinge einzeln zu löschen oder zu kommentieren, wenn ich diese Zeile kommentierte oder löschte es funktionierte. Was ist mein Problem? Alles, was ich tun möchte, ist, dass meine App zu bestimmten Tageszeiten in meiner Heroku-App scrape. Wie kann ich das erreichen? Ist meine Herangehensweise hier falsch? Ich habe etwas gesehen, das APSscheduler genannt wird, das ich stattdessen verwenden sollte. Jede Eingabe zur Verbesserung meines Codes wäre willkommen. Kodieren nicht so lange. Eine Menge davon kam von meinem eigenen Kopf, also wenn es unprofessionell aussieht, deshalb danke im Voraus
es Caps bei Python 3.3 Ich verwende derzeit 3,5. Ich fange an, ein sich entwickelndes Muster zu sehen. Das Neueste ist nicht das Größte, weil es das Neueste ist. eine Menge neuer Code funktioniert nicht mit bestimmten Bibliotheken – losee
Ich sehe es anders auf Git-Hub als von der Verbindung, die Sie zur Verfügung gestellt. auf Github heißt es, es unterstützt 3.5. Ich werde es überprüfen, wenn ich zurück bin. Ich hoffe, es funktioniert – losee