web-dev-qa-db-ja.com

スクリプトからスクレイプランスパイダー

scrap crawlではなくスクリプトからスパイダーを実行したい

このページを見つけました

http://doc.scrapy.org/en/latest/topics/practices.html

しかし実際には、そのスクリプトをどこに置くかについては述べていません。

何か助けてください?

14
Marco Dinatsoli

シンプルでわかりやすいです:)

公式ドキュメント を確認してください。少し変更を加えて、python myscript.pyを実行したときにのみ実行するようにスパイダーを制御できるようにします。スパイダーからインポートするたびに実行するのではなく、 if __name__ == "__main__"を追加するだけです:

import scrapy
from scrapy.crawler import CrawlerProcess

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

if __name__ == "__main__":
    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

次に、ファイルをmyscript.pyとして保存し、 'pythonmyscript.py`を実行します。

楽しい!

28
Almog Cohen

幸いなことに、scrapyソースが開いているので、次の方法に従うことができます crawl command 動作し、コードで同じことを行います。

...
crawler = self.crawler_process.create_crawler()
spider = crawler.spiders.create(spname, **opts.spargs)
crawler.crawl(spider)
self.crawler_process.start()
5
Guy Gavriely

通常のPythonスクリプトを作成してから、Scrapyのコマンドラインオプション runspider を使用すると、作成しなくてもスパイダーを実行できます。プロジェクト。

たとえば、単一のファイルを作成できますstackoverflow_spider.py次のようなもので:

import scrapy

class QuestionItem(scrapy.item.Item):
    idx = scrapy.item.Field()
    title = scrapy.item.Field()

class StackoverflowSpider(scrapy.spider.Spider):
    name = 'SO'
    start_urls = ['http://stackoverflow.com']
    def parse(self, response):
        sel = scrapy.selector.Selector(response)
        questions = sel.css('#question-mini-list .question-summary')
        for i, elem in enumerate(questions):
            l = scrapy.contrib.loader.ItemLoader(QuestionItem(), elem)
            l.add_value('idx', i)
            l.add_xpath('title', ".//h3/a/text()")
            yield l.load_item()

次に、Scrapyが正しくインストールされていれば、次を使用して実行できます。

scrapy runspider stackoverflow_spider.py -t json -o questions-items.json
2
Elias Dorneles

どうしてこれをやらないの?

from scrapy import cmdline

cmdline.execute("scrapy crawl myspider".split())

そのスクリプトを、scrapy.cfgを配置したのと同じパスに配置します

2
Aminah Nuraini