web-dev-qa-db-ja.com

PythonスクリプトからScrapyを実行する方法

私はScrapyが初めてで、Pythonスクリプトから実行する方法を探しています。これを説明する2つのソースが見つかりました。

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

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

スパイダーコードを配置する場所と、メイン関数からそれを呼び出す方法を理解できません。助けてください。これはサンプルコードです:

# 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

ありがとうございました。

48
user47954

他のすべての回答はScrapy v0.xを参照しています。 更新されたドキュメント によると、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

試したことはありませんが、答えは scrapy documentation で見つけることができると思います。それから直接引用するには:

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

私が収集したものから、これはライブラリーの新しい開発であり、以前のアプローチのいくつか(オンラインでの質問など)を廃止します。

14
mrmagooey

スクレイピー0.19.xでは、これを行う必要があります。

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

これらの行に注意してください

settings = get_project_settings()
crawler = Crawler(settings)

これがないと、クモは設定を使用せず、アイテムを保存しません。ドキュメントの例が私のアイテムを保存しなかった理由を理解するのにしばらくかかりました。ドキュメントの例を修正するためにプルリクエストを送信しました。

もう1つは、スクリプトから直接コマンドを呼び出すだけです

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

この最初の回答からこの回答をコピーしました: https://stackoverflow.com/a/19060485/1402286

12
Medeiros

1つのpythonスクリプト内で複数のクローラーを実行する必要がある場合、リアクターは一度しか停止できず、再起動できないため、リアクターの停止は慎重に処理する必要があります。

しかし、私はプロジェクトを行っている間に、

os.system("scrapy crawl yourspider")

最も簡単です。これにより、特に複数のスパイダーがある場合に、あらゆる種類の信号を処理する必要がなくなります。

パフォーマンスが懸念される場合、マルチプロセッシングを使用して、スパイダーを並列に実行できます。

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

単に使用できます

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

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

これらの引数は、グローバルスコープを持つspider __init__関数内で使用します。

1
Arun Augustine