Используя одного паука Scrapy для нескольких веб-сайтов

Я должен создать пользователя настраиваемый поисковый робот / поисковый робот, и я думаю об использовании Scrapy. Но, я не могу твердый код домены и позволенный URL regex:es - это будет вместо этого настраиваться в GUI.

Как делают я (как простой как возможный) создаю паука или ряд пауков с Scrapy, где домены и позволенный URL regex:es динамично настраиваются? Например, Я пишу конфигурацию в файл, и паук читает ее так или иначе.

12
задан Christian Davén 7 March 2010 в 14:18
поделиться

3 ответа

ВНИМАНИЕ: Этот ответ был дан для 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):
         ...

Примечания:

  • Вы можете расширить CrawlSpider, если хотите использовать преимущества его системы правил
  • Для запуска паука используйте: ./scrapy-ctl.py crawl , где name передается в SpiderManager.fromdomain и является ключом для получения дополнительной информации о пауке из бэкенд-системы
  • Поскольку решение переопределяет стандартный SpiderManager, кодирование классического паука (python-модуль на SPIDER) не работает, но, я думаю, это не проблема для вас. Подробнее о менеджере пауков по умолчанию TwistedPluginSpiderManager
10
ответ дан 2 December 2019 в 19:53
поделиться

Что вам нужно, так это динамически создавать классы пауков, создавая подклассы вашего любимого универсального класса пауков, предоставленного 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 , прежде чем создавать их экземпляры. Приправить по вкусу ... ;-).

4
ответ дан 2 December 2019 в 19:53
поделиться

Бесстыдная самореклама на domo ! вам нужно будет создать экземпляр сканера, как указано в примерах, для вашего проекта.

Также вам нужно сделать настраиваемый сканер во время выполнения, который просто передает конфигурацию поисковому роботу и переопределяет настройки во время выполнения, когда конфигурация изменяется.

3
ответ дан 2 December 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: