복붙노트

[PYTHON] Python 스크립트 내에서 Scrapy를 실행하는 방법

PYTHON

Python 스크립트 내에서 Scrapy를 실행하는 방법

저는 Scrapy가 처음인데 파이썬 스크립트에서 실행하는 방법을 찾고 있습니다. 이것을 설명하는 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

고맙습니다.

해결법

  1. ==============================

    1.다른 모든 답변은 Scrapy v0.x를 참조합니다. 업데이트 된 문서에 따르면 Scrapy 1.0 요구 사항 :

    다른 모든 답변은 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
    
  2. ==============================

    2.시도하지는 않았지만 답변은 치료 기록서에서 찾을 수 있다고 생각합니다. 그것에서 직접 인용하기 :

    시도하지는 않았지만 답변은 치료 기록서에서 찾을 수 있다고 생각합니다. 그것에서 직접 인용하기 :

    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
    

    내가 모은 것에서는 온라인에서 이전의 접근법 중 일부를 쓸모 없게 만드는 라이브러리의 새로운 개발이 있습니다.

  3. ==============================

    3.0.19.x의 scrapy에서는 다음을 수행해야합니다.

    0.19.x의 scrapy에서는 다음을 수행해야합니다.

    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)
    

    그것 없이는 거미가 설정을 사용하지 않고 항목을 저장하지 않습니다. 문서의 예제가 내 항목을 저장하지 않는 이유를 알아 냈습니다. doc 예제를 수정하라는 요청을 보냈습니다.

    한 가지 더 할 일은 스크립트에서 직접 명령을 호출하는 것입니다.

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

    내 첫 번째 대답에서이 대답을 복사했습니다. https://stackoverflow.com/a/19060485/1402286

  4. ==============================

    4.하나의 파이썬 스크립트 내에서 여러 크롤러를 실행해야하는 경우 원자로를 한 번만 중지하고 다시 시작할 수 없으므로 원자로 정지는주의해서 처리해야합니다.

    하나의 파이썬 스크립트 내에서 여러 크롤러를 실행해야하는 경우 원자로를 한 번만 중지하고 다시 시작할 수 없으므로 원자로 정지는주의해서 처리해야합니다.

    그러나, 나는 내 프로젝트를하면서 사용하는 것을 발견했다.

    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)
    
  5. ==============================

    5.

    # -*- 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()
    

    명령 줄에서 abc_spider를 사용하여 scrap crawl을 실행할 수있는 경로에이 코드를 추가하십시오. (Scrapy == 0.24.6으로 테스트 됨)

  6. ==============================

    6.간단한 크롤링을 실행하려면 명령을 실행하여 간단합니다.

    간단한 크롤링을 실행하려면 명령을 실행하여 간단합니다.

    치료 크롤링. 검색 결과를 다음과 같은 형식으로 저장하기 위해 내보낼 수있는 또 다른 옵션이 있습니다. Json, xml, csv.

    scrap crawl -o result.csv 또는 result.json 또는 result.xml.

    그것을 시도하고 싶을 수도있다.

  7. from https://stackoverflow.com/questions/13437402/how-to-run-scrapy-from-within-a-python-script by cc-by-sa and MIT license