2015-04-21 3 views
3

avez ce code qui exécute crawler scrapy à partir du script (http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script). Mais ça ne marche pas.Comment utiliser APscheduler avec scrapy

from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy import log,signals 
from spiders.egov import EgovSpider 
from scrapy.utils.project import get_project_settings 

def run(): 
    spider =EgovSpider() 
    settings = get_project_settings() 
    crawler = Crawler(settings) 
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
    crawler.configured 
    crawler.crawl(spider) 
    crawler.start() 
    log.start() 
    reactor.run() 


from apscheduler.schedulers.twisted import TwistedScheduler 
sched = TwistedScheduler() 
sched.add_job(run, 'interval', seconds=10) 
sched.start() 

Mon araignée:

import scrapy 

class EgovSpider(scrapy.Spider): 
    name = 'egov' 
    start_urls = ['http://egov-buryatia.ru/index.php?id=1493'] 


    def parse(self, response): 

     data = response.xpath("//div[@id='main_wrapper_content_news']//tr//text()").extract() 
     print data 
     print response.url 
     f = open("vac.txt","a") 
     for d in data: 
      f.write(d.encode(encoding="UTF-8") + "\n") 

     f.write(str(now)) 
     f.close() 

Si je remplace la ligne "reactor.run()", araignée a commencé une fois au bout de 10 secondes:

from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy import log,signals 
from spiders.egov import EgovSpider 
from scrapy.utils.project import get_project_settings 

def run(): 
    spider =EgovSpider() 
    settings = get_project_settings() 
    crawler = Crawler(settings) 
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
    crawler.configured 
    crawler.crawl(spider) 
    crawler.start() 
    log.start() 

from apscheduler.schedulers.twisted import TwistedScheduler 
sched = TwistedScheduler() 
sched.add_job(run, 'interval', seconds=10) 
sched.start() 
reactor.run() 

Je suis faible expérience avec Python et anglais :) S'il vous plaît, aidez-moi.

+0

OK, alors quel est le problème avec le dernier morceau de code? Vous avez dit que ça a commencé après 10 secondes comme il était censé le faire. –

+0

est démarré une fois. Pas toutes les 10 secondes. – kzr

+0

Si vous êtes toujours à la recherche d'une réponse [ici] (http://kirankoduru.github.io/python/running-scrapy-programmatically.html) est un article de blog que j'ai écrit il n'y a pas longtemps sur la façon de l'implémenter. Aussi, vous avez besoin de la version 0.24 pour que cela fonctionne. –

Répondre

0

J'ai rencontré le même problème aujourd'hui. Voici quelques informations. Le réacteur torsadé ne peut pas redémarrer une fois qu'il a fonctionné et s'est arrêté. Vous devriez démarrer un réacteur à long terme et ajouter une ou plusieurs tâches sur chenilles périodiquement.

Pour simplifier le code, vous pouvez utiliser CrawlerProcess.start(), qui inclut reactor.run().

from scrapy.crawler import CrawlerProcess 
from spiders.egov import EgovSpider 
from scrapy.utils.project import get_project_settings 
from apscheduler.schedulers.twisted import TwistedScheduler 

process = CrawlerProcess(get_project_settings()) 
sched = TwistedScheduler() 
sched.add_job(process.crawl, 'interval', args=[EgovSpider], seconds=10) 
sched.start() 
process.start(False) # Do not stop reactor after spider closes