wake-up-neo.com

So führen Sie Scrapy in einem Python Skript aus

Ich bin neu in Scrapy und suche nach einer Möglichkeit, es von einem Python Skript aus auszuführen. Ich habe 2 Quellen gefunden, die dies erklären:

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

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

Ich kann nicht herausfinden, wo ich meinen Spinnencode ablegen soll und wie ich ihn von der Hauptfunktion aus aufrufen soll. Bitte helfen Sie. Dies ist der Beispielcode:

# 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 __== "__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

Vielen Dank.

48
user47954

Alle anderen Antworten beziehen sich auf Scrapy v0.x. Laut den aktualisierten Dokumenten verlangt Scrapy 1.0:

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
55
danielmhanover

Obwohl ich es noch nicht ausprobiert habe, finde ich die Antwort in der Scrapy-Dokumentation . Um direkt daraus zu zitieren:

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

Soweit ich weiß, handelt es sich um eine neue Entwicklung in der Bibliothek, die einige der früheren Online-Ansätze (wie die in der Frage genannten) überholt.

14
mrmagooey

In scrapy 0.19.x sollten Sie dies tun:

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

Beachten Sie diese Zeilen

settings = get_project_settings()
crawler = Crawler(settings)

Ohne sie wird Ihre Spinne Ihre Einstellungen nicht verwenden und die Gegenstände nicht speichern. Ich habe eine Weile gebraucht, um herauszufinden, warum das Beispiel in der Dokumentation meine Artikel nicht gespeichert hat. Ich habe eine Pull-Anfrage gesendet, um das Dokumentbeispiel zu reparieren.

Eine weitere Möglichkeit besteht darin, den Befehl direkt von Ihrem Skript aus aufzurufen

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

Kopierte diese Antwort von meiner ersten Antwort hier: https://stackoverflow.com/a/19060485/1402286

12
Medeiros

Wenn mehrere Crawler in einem python Skript ausgeführt werden müssen, muss der Reaktorstopp mit Vorsicht behandelt werden, da der Reaktor nur einmal gestoppt und nicht neu gestartet werden kann.

Allerdings habe ich bei meinem Projekt festgestellt, dass mit

os.system("scrapy crawl yourspider")

ist das einfachste. Dies erspart mir den Umgang mit allen möglichen Signalen, besonders wenn ich mehrere Spinnen habe.

Wenn es um die Leistung geht, können Sie Ihre Spinnen mithilfe von Multiprocessing parallel ausführen. Beispiel:

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)
6
Feng

Einfach können wir verwenden

from scrapy.crawler import CrawlerProcess
from project.spiders.test_spider import SpiderName

process = CrawlerProcess()
process.crawl(SpiderName, arg1=val1,arg2=val2)
process.start()

Verwenden Sie diese Argumente in spider __init__ Funktion mit dem globalen Gültigkeitsbereich.

1
Arun Augustine