Подтвердить что ты не робот

Как программировать и запускать программный паук (URL-адреса и настройки)

Я написал работающий искатель с помощью scrapy,
теперь я хочу контролировать это через Django webapp, то есть:

  • Установите 1 или несколько start_urls
  • Установите 1 или несколько allowed_domains
  • Установить settings значения
  • Запуск паука
  • Стоп/пауза/возобновление паука
  • получить статистику во время работы
  • получить некоторые статистические данные после завершения паука.

Сначала я подумал, что scrapyd был сделан для этого, но после прочтения документа кажется, что это более демона, способного управлять "упакованными пауками", иначе "яичниками"; и что все настройки (start_urls, allowed_domains, settings) по-прежнему должны быть жестко закодированы в самом "лучечном яйце"; так что это не похоже на решение моего вопроса, если я не пропустил что-то.

Я также рассмотрел этот вопрос: Как указать URL-адрес для скрининга для сканирования?; Но лучший ответ на предоставление множественных URL-адресов квалифицируется автором как "уродливый взлом", связанный с подпроцессом python и сложной обработкой оболочки, поэтому я не думаю, что решение можно найти здесь. Кроме того, он может работать для start_urls, но он, похоже, не позволяет allowed_domains или settings.

Затем я взглянул на scrapy webservices: Кажется, это хорошее решение для получения статистики. Тем не менее, он по-прежнему требует запуска паука, и нет подсказки для изменения settings

Есть несколько вопросов по этому вопросу, ни один из них не кажется удовлетворительным:

Я знаю, что терапия используется в производственных средах; и такой инструмент, как scrapyd, показывает, что есть определенные способы справиться с этими требованиями (я не могу себе представить, что скребковые яйца scrapyd имеют дело с ними!)

Большое спасибо за вашу помощь.

4b9b3361

Ответ 1

Сначала я думал, что скрапид был сделан для этого, но после прочтения документа кажется, что это еще один демон, способный управлять "упакованными пауками", иначе "яичниками"; и что все настройки (start_urls, allowed_domains, settings) все равно должны быть жестко закодированы в самом "лучечном яйце"; так что это не похоже на решение моего вопроса, если я не пропустил что-то.

Я не согласен с приведенным выше утверждением, start_urls не обязательно должны быть жестко закодированы, они могут быть динамически переданы классу, вы должны передать его как аргумент, подобный этому

http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

Или вы сможете получить URL-адреса из базы данных или файла. Я получаю его из базы данных, такой как

class WikipediaSpider(BaseSpider):
    name = 'wikipedia'
    allowed_domains = ['wikipedia.com']
    start_urls = []

    def __init__(self, name=None, url=None, **kwargs):
        item = MovieItem()
        item['spider'] = self.name
        # You can pass a specific url to retrieve 
        if url:
            if name is not None:
                self.name = name
            elif not getattr(self, 'name', None):
                raise ValueError("%s must have a name" % type(self).__name__)
            self.__dict__.update(kwargs)
            self.start_urls = [url]
        else:
            # If there is no specific URL get it from Database
            wikiliks = # < -- CODE TO RETRIEVE THE LINKS FROM DB -->
            if wikiliks == None:
                print "**************************************"
                print "No Links to Query"
                print "**************************************"
                return None

            for link in wikiliks:
                # SOME PROCESSING ON THE LINK GOES HERE
                self.start_urls.append(urllib.unquote_plus(link[0]))

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        # Remaining parse code goes here

Ответ 2

Для изменения настроек программным способом и запуска скребка из приложения, вот что я получил:

from scrapy.crawler import CrawlerProcess
from myproject.spiders import MySpider
from scrapy.utils.project import get_project_settings

os.environ['SCRAPY_SETTINGS_MODULE'] = 'myproject.my_settings_module'
scrapy_settings = get_project_settings()
scrapy_settings.set('CUSTOM_PARAM', custom_vaule)
scrapy_settings.set('ITEM_PIPELINES', {})  # don't write jsons or anything like that
scrapy_settings.set('DOWNLOADER_MIDDLEWARES', {
   'myproject.middlewares.SomeMiddleware': 100,
})
process = CrawlerProcess(scrapy_settings)
process.crawl(MySpider, start_urls=start_urls)
process.start()

Ответ 3

Это действительно просто!

from mypackage.spiders import MySpider
from scrapy.crawler import CrawlerProcess

results = []

class MyPipeline(object):
    """ A custom pipeline that stores scrape results in 'results'"""
    def process_item(self, item, spider):
        results.append(dict(item))

process = CrawlerProcess({
    # An example of a custom setting
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',  
    'ITEM_PIPELINES': {'__main__.MyPipeline': 1},   # Hooking in our custom pipline above
})

start_urls=[
    'http://example.com/page1', 
    'http://example.com/page2',
]
process.crawl(MySpider, start_urls=start_urls)
process.start() # the script will block here until the crawling is finished

# Do something with the results
print results

Ответ 4

Я думаю, вам нужно посмотреть на это

http://django-dynamic-scraper.readthedocs.org/en/latest/

Это несколько похоже на то, что вы хотите. Он также использует сельдерей для планирования задач. Вы можете увидеть код, чтобы посмотреть, что он делает. Я думаю, вам будет легко изменить свой код, чтобы сделать то, что вы хотите

Он также имеет хорошие документы о том, как настроить интерфейс с помощью django