84 votes

Comment exécuter Scrapy à partir d'un script Python ?

Je suis nouveau à Scrapy et je cherche un moyen de l'exécuter à partir d'un script Python. J'ai trouvé 2 sources qui expliquent cela :

http://tryolabs.com/Blog/2011/09/27/calling-scrapy-python-script/

http://snipplr.com/view/67006/using-scrapy-from-a-script/

Je n'arrive pas à savoir où je dois mettre mon code spider et comment l'appeler à partir de la fonction principale. Merci de m'aider. Voici l'exemple de code :

# This snippet can be used to run scrapy spiders independent of scrapyd or the scrapy command line tool and use it from a script. 
# 
# The multiprocessing library is used in order to work around a bug in Twisted, in which you cannot restart an already running reactor or in this case a scrapy instance.
# 
# [Here](http://groups.google.com/group/scrapy-users/browse_thread/thread/f332fc5b749d401a) is the mailing-list discussion for this snippet. 

#!/usr/bin/python
import os
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'project.settings') #Must be at the top before other imports

from scrapy import log, signals, project
from scrapy.xlib.pydispatch import dispatcher
from scrapy.conf import settings
from scrapy.crawler import CrawlerProcess
from multiprocessing import Process, Queue

class CrawlerScript():

    def __init__(self):
        self.crawler = CrawlerProcess(settings)
        if not hasattr(project, 'crawler'):
            self.crawler.install()
        self.crawler.configure()
        self.items = []
        dispatcher.connect(self._item_passed, signals.item_passed)

    def _item_passed(self, item):
        self.items.append(item)

    def _crawl(self, queue, spider_name):
        spider = self.crawler.spiders.create(spider_name)
        if spider:
            self.crawler.queue.append_spider(spider)
        self.crawler.start()
        self.crawler.stop()
        queue.put(self.items)

    def crawl(self, spider):
        queue = Queue()
        p = Process(target=self._crawl, args=(queue, spider,))
        p.start()
        p.join()
        return queue.get(True)

# Usage
if __name__ == "__main__":
    log.start()

    """
    This example runs spider1 and then spider2 three times. 
    """
    items = list()
    crawler = CrawlerScript()
    items.append(crawler.crawl('spider1'))
    for i in range(3):
        items.append(crawler.crawl('spider2'))
    print items

# Snippet imported from snippets.scrapy.org (which no longer works)
# author: joehillen
# date  : Oct 24, 2010

Nous vous remercions.

1voto

moorthypnt Points 21

Il s'agit d'une amélioration de Scrapy lance une erreur lorsqu'il est exécuté à l'aide de crawlerprocess

y https://github.com/scrapy/scrapy/issues/1904#issuecomment-205331087

Il est très important qu'il s'exécute et qu'il exporte des données, des images ou des fichiers.

Une fois que c'est terminé, faites comme j'ai collé dans mon programme au-dessus de la définition de la classe spider et en dessous de __name __ pour invoquer les paramètres.

il obtiendra les paramètres nécessaires que "from scrapy.utils.project import get_project_settings" n'a pas réussi à faire, ce qui est recommandé par de nombreuses personnes.

les deux parties ci-dessus et ci-dessous doivent être présentes ensemble. une seule ne s'exécute pas. Spider s'exécutera dans le dossier scrapy.cfg et non dans un autre dossier.

le diagramme en arbre peut être affiché par les modérateurs à titre de référence

#Tree
[enter image description here][1]

#spider.py
import sys
sys.path.append(r'D:\ivana\flow') #folder where scrapy.cfg is located

from scrapy.crawler import CrawlerProcess
from scrapy.settings import Settings
from flow import settings as my_settings

#----------------Typical Spider Program starts here-----------------------------

          spider class definition here

#----------------Typical Spider Program ends here-------------------------------

if __name__ == "__main__":

    crawler_settings = Settings()
    crawler_settings.setmodule(my_settings)

    process = CrawlerProcess(settings=crawler_settings)
    process.crawl(FlowSpider) # it is for class FlowSpider(scrapy.Spider):
    process.start(stop_after_crawl=True)

-3voto

Kixoms Points 180
# -*- coding: utf-8 -*-
import sys
from scrapy.cmdline import execute

def gen_argv(s):
    sys.argv = s.split()

if __name__ == '__main__':
    gen_argv('scrapy crawl abc_spider')
    execute()

Placez ce code dans le chemin que vous pouvez exécuter scrapy crawl abc_spider à partir de la ligne de commande. (Testé avec Scrapy==0.24.6)

-6voto

doeun kol Points 239

Si vous souhaitez lancer un simple crawling, il suffit de lancer une commande :

scrapy crawl . Il y a d'autres options pour exporter vos résultats dans certains formats comme : Json, xml, csv.

scrapy crawl -o result.csv ou result.json ou result.xml.

vous pouvez l'essayer

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X