CẢNH BÁO: Câu trả lời này là dành cho Scrapy v0.7, trình quản lý spider api đã thay đổi rất nhiều kể từ đó.
Override lớp SpiderManager mặc định, tải quy tắc tùy chỉnh của bạn từ một cơ sở dữ liệu hoặc ở một nơi khác và instanciate một con nhện tùy chỉnh với các quy tắc của riêng/regexes của bạn và domain_name
trong mybot/settings.py:
SPIDER_MANAGER_CLASS = 'mybot.spidermanager.MySpiderManager'
trong 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)
và bây giờ lớp nhện tùy chỉnh của bạn, trong 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):
...
Ghi chú:
- Bạn có thể mở rộng CrawlSpider quá nếu bạn muốn tận dụng lợi thế của hệ thống các Quy định
- Để chạy sử dụng nhện:
./scrapy-ctl.py crawl <name>
, nơi name
được chuyển cho SpiderManager.fromdomain và là chìa khóa để truy xuất thêm thông tin về nhện từ hệ thống phụ trợ
- Khi giải pháp ghi đè SpiderManager mặc định, mã hóa một con nhện cổ điển (mô-đun python trên mỗi SPIDER) không hoạt động, nhưng tôi nghĩ đây không phải là vấn đề cho bạn.Thông tin thêm về quản lý nhện mặc định TwistedPluginSpiderManager
@Christian Daven: Chẳng phải câu trả lời chấp nhận được cho câu hỏi của bạn? – dangra