Я должен создать пользователя настраиваемый поисковый робот / поисковый робот, и я думаю об использовании Scrapy. Но, я не могу твердый код домены и позволенный URL regex:es - это будет вместо этого настраиваться в GUI.
Как делают я (как простой как возможный) создаю паука или ряд пауков с Scrapy, где домены и позволенный URL regex:es динамично настраиваются? Например, Я пишу конфигурацию в файл, и паук читает ее так или иначе.
ВНИМАНИЕ: Этот ответ был дан для Scrapy v0.7, api spider manager сильно изменился с тех пор.
Переопределите класс SpiderManager по умолчанию, загрузите свои собственные правила из базы данных или откуда-нибудь еще и создайте своего паука с собственными правилами/регексами и именем домена
в mybot/settings.py:
SPIDER_MANAGER_CLASS = 'mybot.spidermanager.MySpiderManager'
в 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):
...
Примечания:
./scrapy-ctl.py crawl
, где name
передается в SpiderManager.fromdomain и является ключом для получения дополнительной информации о пауке из бэкенд-системы Что вам нужно, так это динамически создавать классы пауков, создавая подклассы вашего любимого универсального класса пауков, предоставленного scrapy
( CrawlSpider
подклассы с вашими правилами
или XmlFeedSpider
, или что-то еще) и добавлением domain_name
, start_urls
и, возможно, extra_domainnames
(и / или start_requests ()
и т. Д.), Когда вы получаете или выводите их из своего графического интерфейса (или файла конфигурации, или чего-то еще).
Python упрощает выполнение такого динамического создания объектов класса; очень простой пример:
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))
Это дает вам список очень простых классов пауков - вы, вероятно, захотите добавить к ним методы parse
, прежде чем создавать их экземпляры. Приправить по вкусу ... ;-).
Бесстыдная самореклама на domo ! вам нужно будет создать экземпляр сканера, как указано в примерах, для вашего проекта.
Также вам нужно сделать настраиваемый сканер во время выполнения, который просто передает конфигурацию поисковому роботу и переопределяет настройки во время выполнения, когда конфигурация изменяется.