2016-08-09 148 views
0

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

enter image description here

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('?&amp;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

Antwort

1

Ich bin nicht sicher über Heroku. Aber normalerweise können Sie solche automatisierten Aufgaben in Django durch Sellerie erreichen.

Sie haben tolle Dokumentation hier. http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

+0

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

+0

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