[PYTHON] 여러 웹 사이트에 하나의 Scrapy 스파이더 사용
PYTHON여러 웹 사이트에 하나의 Scrapy 스파이더 사용
사용자가 구성 할 수있는 웹 스파이더 / 크롤러를 만들어야하고 Scrapy를 사용할 생각입니다. 하지만 도메인을 하드 코딩 할 수없고 URL regex : es를 사용할 수 없습니다. 대신 GUI에서 구성 할 수 있습니다.
도메인과 허용 된 URL 정규식을 동적으로 구성 할 수있는 Scrapy를 사용하여 스파이더 또는 스파이더 집합을 가능한 한 간단하게 만들 수 있습니까? 예 : 필자는 파일에 구성을 쓰고 거미는 어떻게 든 읽습니다.
해결법
-
==============================
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.필요한 것은 스파이더 클래스를 동적으로 생성하고, 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.domo에서 뻔뻔한 자기 승진! 프로젝트에서 예제에 나와있는 크롤러를 인스턴스화해야합니다.
domo에서 뻔뻔한 자기 승진! 프로젝트에서 예제에 나와있는 크롤러를 인스턴스화해야합니다.
또한 크롤러를 런타임에 구성 할 수 있도록해야합니다. 구성은 크롤러에 구성을 전달하고 구성이 변경되면 런타임에 설정을 재정의하는 것입니다.
-
==============================
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"
from https://stackoverflow.com/questions/2396529/using-one-scrapy-spider-for-several-websites by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] numpy에서 다차원 배열의 자기 상관 (0) | 2018.10.28 |
---|---|
[PYTHON] 헤더가 반복되지 않고 여러 개의 CSV 파일 병합 (Python 사용) [닫힘] (0) | 2018.10.28 |
[PYTHON] Spyder의 간단한 Python 다중 처리 기능이 결과를 출력하지 않습니다. (0) | 2018.10.28 |
[PYTHON] paramiko ssh exec_command에서 지속적으로 출력을 얻습니다. (0) | 2018.10.28 |
[PYTHON] Postgres - 누락 된 데이터가 0 인 행을 반환하는 방법? (0) | 2018.10.28 |