Comment exécuter Scrapy depuis 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 ceci:

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 à trouver où mettre mon code araignée et comment l'appeler à partir de la fonction principale. S'il vous plaît aider. C'est 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

Merci vous.

41
demandé sur Anony-Mousse 2012-11-18 08:09:49

6 réponses

toutes les autres réponses référence Scrapy v0.x. Selon la mise à jour des docs, Scrapy 1.0 exigences:

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider(scrapy.Spider):
    # Your spider definition
    ...

process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})

process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished
48
répondu danielmhanover 2015-07-13 01:39:37

bien que je ne l'ai pas essayé, je pense que la réponse se trouve dans le scrapy documentation. Pour citer directement:

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy import log
from testspiders.spiders.followall import FollowAllSpider

spider = FollowAllSpider(domain='scrapinghub.com')
crawler = Crawler(Settings())
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
reactor.run() # the script will block here

De ce que je comprends, c'est un nouveau développement dans la bibliothèque qui rend certaines démarches en ligne (comme par exemple dans la question) obsolète.

13
répondu mrmagooey 2013-01-10 21:16:36

Dans scrapy de 0,19.x vous devriez faire ceci:

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from testspiders.spiders.followall import FollowAllSpider
from scrapy.utils.project import get_project_settings

spider = FollowAllSpider(domain='scrapinghub.com')
settings = get_project_settings()
crawler = Crawler(settings)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
reactor.run() # the script will block here until the spider_closed signal was sent

notez ces lignes

settings = get_project_settings()
crawler = Crawler(settings)

sans cela votre araignée n'utilisera pas vos paramètres et ne sauvera pas les éléments. J'ai mis du temps à comprendre pourquoi l'exemple dans la documentation ne sauvegardait pas mes articles. J'ai envoyé une demande pour corriger l'exemple du doc.

une autre façon de le faire est d'appeler la commande directement à partir de votre script

from scrapy import cmdline
cmdline.execute("scrapy crawl followall".split())  #followall is the spider's name

Copié cette réponse de ma première réponse ici: https://stackoverflow.com/a/19060485/1402286

12
répondu Medeiros 2017-05-23 11:47:19

Lorsqu'il y a plusieurs crawlers qui doivent être exécutés à l'intérieur d'un script python, l'arrêt du réacteur doit être manipulé avec prudence car le réacteur ne peut être arrêté qu'une seule fois et ne peut pas être redémarré.

cependant, j'ai trouvé en faisant mon projet que l'utilisation

os.system("scrapy crawl yourspider")

est le plus facile. Cela m'évitera de manipuler toutes sortes de signaux, surtout quand j'ai plusieurs araignées.

si la Performance est un problème, vous pouvez utiliser multiprocessing pour exécuter vos araignées en parallèle, quelque chose comme:

def _crawl(spider_name=None):
    if spider_name:
        os.system('scrapy crawl %s' % spider_name)
    return None

def run_crawler():

    spider_names = ['spider1', 'spider2', 'spider2']

    pool = Pool(processes=len(spider_names))
    pool.map(_crawl, spider_names)
7
répondu Feng 2014-12-02 05:01:16
# -*- 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()

mettez ce code sur le chemin que vous pouvez exécuter scrapy crawl abc_spider en ligne de commande. (Testé avec Scrapy= = 0.24.6)

-2
répondu Kixoms 2016-07-07 09:38:19

si vous voulez exécuter un simple rampement, c'est facile en exécutant simplement la commande:

scrapy d'analyse . Il y a d'autres options pour exporter vos résultats à stocker dans certains formats comme: JSON, xml, csv.

résultat scrapy crawl-O.csv ou de résultat.json ou de résultat.XML.

vous pouvez essayer

-2
répondu doeun kol 2017-12-27 09:33:13