복붙노트

[PYTHON] 여러 웹 사이트에 하나의 Scrapy 스파이더 사용

PYTHON

여러 웹 사이트에 하나의 Scrapy 스파이더 사용

사용자가 구성 할 수있는 웹 스파이더 / 크롤러를 만들어야하고 Scrapy를 사용할 생각입니다. 하지만 도메인을 하드 코딩 할 수없고 URL regex : es를 사용할 수 없습니다. 대신 GUI에서 구성 할 수 있습니다.

도메인과 허용 된 URL 정규식을 동적으로 구성 할 수있는 Scrapy를 사용하여 스파이더 또는 스파이더 집합을 가능한 한 간단하게 만들 수 있습니까? 예 : 필자는 파일에 구성을 쓰고 거미는 어떻게 든 읽습니다.

해결법

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

    1.경고 :이 답변 Scrapy v0.7에 대한 거미 관리자 api 그 이후로 많이 변경되었습니다.

    경고 :이 답변 Scrapy v0.7에 대한 거미 관리자 api 그 이후로 많이 변경되었습니다.

    기본 SpiderManager 클래스를 덮어 쓰거나 데이터베이스 또는 다른 곳에서 사용자 정의 규칙을로드하고 고유 한 규칙 / 정규식 및 domain_name을 사용하여 사용자 정의 스파이더를 인스턴스화합니다.

    mybot / settings.py :

    SPIDER_MANAGER_CLASS = 'mybot.spidermanager.MySpiderManager'
    

    in mybot / spidermanager.py :

    from mybot.spider import MyParametrizedSpider
    
    class MySpiderManager(object):
        loaded = True
    
        def fromdomain(self, name):
            start_urls, extra_domain_names, regexes = self._get_spider_info(name)
            return MyParametrizedSpider(name, start_urls, extra_domain_names, regexes)
    
        def close_spider(self, spider):
            # Put here code you want to run before spiders is closed
            pass
    
        def _get_spider_info(self, name):
            # query your backend (maybe a sqldb) using `name` as primary key, 
            # and return start_urls, extra_domains and regexes
            ...
            return (start_urls, extra_domains, regexes)
    

    이제 mybot / spider.py에있는 커스텀 스파이더 클래스 :

    from scrapy.spider import BaseSpider
    
    class MyParametrizedSpider(BaseSpider):
    
        def __init__(self, name, start_urls, extra_domain_names, regexes):
            self.domain_name = name
            self.start_urls = start_urls
            self.extra_domain_names = extra_domain_names
            self.regexes = regexes
    
         def parse(self, response):
             ...
    

    노트:

  2. ==============================

    2.필요한 것은 스파이더 클래스를 동적으로 생성하고, scrapy (규칙이 추가 된 CrawlSpider 하위 클래스 또는 XmlFeedSpider 등)에서 제공 한 기본 스파이더 클래스를 서브 클래스로 만들고 domain_name, start_urls 및 extra_domain_names (및 / 또는 start_requests ()를 추가하는 것입니다. , etc)를 사용하여 GUI (또는 설정 파일 등)에서 가져 오거나 추론 할 수 있습니다.

    필요한 것은 스파이더 클래스를 동적으로 생성하고, scrapy (규칙이 추가 된 CrawlSpider 하위 클래스 또는 XmlFeedSpider 등)에서 제공 한 기본 스파이더 클래스를 서브 클래스로 만들고 domain_name, start_urls 및 extra_domain_names (및 / 또는 start_requests ()를 추가하는 것입니다. , etc)를 사용하여 GUI (또는 설정 파일 등)에서 가져 오거나 추론 할 수 있습니다.

    파이썬은 클래스 객체의 동적 생성을 쉽게 수행 할 수있게 해줍니다. 아주 간단한 예제는 다음과 같습니다.

    from scrapy import spider
    
    def makespider(domain_name, start_urls,
                   basecls=spider.BaseSpider):
      return type(domain_name + 'Spider',
                  (basecls,),
                  {'domain_name': domain_name,
                   'start_urls': start_urls})
    
    allspiders = []
    for domain, urls in listofdomainurlpairs:
      allspiders.append(makespider(domain, urls))
    

    이렇게하면 매우 뼈없는 스파이더 클래스 목록을 얻을 수 있습니다. 인스턴스 생성 전에 구문 분석 메소드를 추가 할 수 있습니다. 맛 시즌 ... ;-).

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

    3.domo에서 뻔뻔한 자기 승진! 프로젝트에서 예제에 나와있는 크롤러를 인스턴스화해야합니다.

    domo에서 뻔뻔한 자기 승진! 프로젝트에서 예제에 나와있는 크롤러를 인스턴스화해야합니다.

    또한 크롤러를 런타임에 구성 할 수 있도록해야합니다. 구성은 크롤러에 구성을 전달하고 구성이 변경되면 런타임에 설정을 재정의하는 것입니다.

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

    4.이제 다음과 같은 목적으로 치료를 구성하는 것이 매우 쉽습니다.

    이제 다음과 같은 목적으로 치료를 구성하는 것이 매우 쉽습니다.

    다음과 같이 끝나야합니다.

    class MySpider(Spider):
    
        name = "myspider"
    
        def start_requests(self):
            yield Request(self.start_url, callback=self.parse)
    
    
        def parse(self, response):
            ...
    

    그리고 다음과 같이 호출해야합니다.

    scrapy crawl myspider -a start_url="http://example.com"
    
  5. from https://stackoverflow.com/questions/2396529/using-one-scrapy-spider-for-several-websites by cc-by-sa and MIT license