84

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 __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

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

4

8 に答える 8

93

他のすべての回答は Scrapy v0.x を参照しています。更新された docsによると、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
于 2015-07-13T01:39:37.167 に答える
16

私はそれを試していませんが、答えはスクレイピーのドキュメント内にあると思います。そこから直接引用するには:

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

私が収集したものから、これはライブラリの新しい開発であり、オンラインでの以前のアプローチの一部 (問題のアプローチなど) が時代遅れになります。

于 2013-01-10T21:16:36.223 に答える
1

これは、 クローラープロセスを使用して実行するとエラーがスローされる Scrapyの改善です

およびhttps://github.com/scrapy/scrapy/issues/1904#issuecomment-205331087

最初に、コマンド ラインを正常に実行するための通常のスパイダーを作成します。データ、画像、またはファイルを実行してエクスポートすることが非常に重要です

それが終わったら、スパイダークラス定義の上と __name __ の下に私のプログラムに貼り付けたのと同じようにして、設定を呼び出します。

「scrapy.utils.projectからのインポートget_project_settings」が失敗した必要な設定を取得します。これは多くの人に推奨されています

上と下の両方の部分が一緒にあるはずです。1つだけ実行されません。Spider は他のフォルダではなく、scrapy.cfg フォルダで実行されます

樹形図は参照用にモデレーターによって表示される場合があります

#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)
于 2020-10-22T06:46:31.310 に答える
-3
# -*- 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()

scrapy crawl abc_spiderこのコードを、コマンド ラインから実行できるパスに配置します。(Scrapy==0.24.6でテスト済み)

于 2016-07-07T09:38:19.247 に答える