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

Scrapy Очень простой пример

Привет, у меня есть Python Scrapy, установленная на моем mac, и я пытался следовать v

4b9b3361

Ответ 1

Возможно, вам удастся сначала просмотреть учебник, в отличие от веб-страницы "Scrapy on a glance".

В учебнике подразумевается, что Scrapy - это, по сути, отдельная программа.

Запуск команды scrapy startproject tutorial создаст папку с именем tutorial несколько уже настроенных вами файлов.

Например, в моем случае модули/пакеты items, pipelines, settings и spiders были добавлены в корневой пакет tutorial.

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

Класс TorrentItem будет помещен внутри items.py, а класс MininovaSpider войдет в папку spiders.

Как только проект настроен, параметры командной строки для Scrapy выглядят довольно просто. Они принимают форму:

scrapy crawl <website-name> -o <output-file> -t <output-type>

В качестве альтернативы, если вы хотите запустить scrapy без накладных расходов на создание каталога проекта, вы можете использовать команду runspider:

scrapy runspider my_spider.py

Ответ 2

TL; DR: см. Автономный минимальный пример script для запуска scrapy.

Прежде всего, наличие нормального проекта Scrapy с отдельным пакетом .cfg, settings.py, pipelines.py, items.py, spiders и т.д. является рекомендуемым способом хранения и обработки вашей логики веб-скрепок. Он обеспечивает модульность, разделение проблем, которые делают вещи организованными, ясными и проверяемыми.

Если вы выполните официальное учебное пособие по Scrapy для создания проекта, вы выполняете веб-очистку с помощью специальной командной строки scrapy инструмент:

scrapy crawl myspider

Но scrapy также предоставляет API для запускать сканирование из script.

Существует несколько ключевых концепций:

  • Settings class - в основном ключ-значение "контейнер", который инициализируется встроенные значения по умолчанию
  • Crawler class - основной класс, который действует как клей для всех различных компонентов, участвующих в веб-очистке с помощью Scrapy.
  • Twisted reactor - поскольку Scrapy встроена поверх асинхронной сетевой библиотеки twisted - чтобы запустить искатель, нам нужно поместить его в Twisted Reactor, который простыми словами, цикл событий:

Реактор является ядром цикла событий в Twisted - петле, которая управляет приложениями с помощью Twisted. Цикл событий представляет собой конструкцию программирования, которая ждет и отправляет события или сообщения в программу. Он работает, вызывая некоторые внутренний или внешний "поставщик событий", который обычно блокируется до событие, и затем вызывает соответствующий обработчик событий ( "рассылает событие" ). Реактор обеспечивает основные интерфейсы количество услуг, включая сетевые коммуникации, потоки и диспетчеризация событий.

Вот базовый и упрощенный процесс запуска Scrapy из script:

  • создайте экземпляр Settings (или используйте get_project_settings() для использования существующих настроек):

    settings = Settings()  # or settings = get_project_settings()
    
  • экземпляр Crawler с экземпляром Settings, переданным в:

    crawler = Crawler(settings)
    
  • создать экземпляр паука (это то, о чем все в конечном итоге, верно?):

    spider = MySpider()
    
  • настроить сигналы. Это важный шаг, если вы хотите иметь логику пост-обработки собирать статистику или, по крайней мере, когда-либо завершать сканирование с момента скручивания reactor необходимо остановить вручную. Документы Scrapy предлагают остановить reactor в обработчике spider_closed:

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

def callback(spider, reason):
    stats = spider.crawler.stats.get_stats()
    # stats here is a dictionary of crawling stats that you usually see on the console        

    # here we need to stop the reactor
    reactor.stop()

crawler.signals.connect(callback, signal=signals.spider_closed)
  • настроить и запустить экземпляр искателя с переданным пауком:

    crawler.configure()
    crawler.crawl(spider)
    crawler.start()
    
  • необязательно запустите logging:

    log.start()
    
  • запустить реактор - это заблокировало выполнение script:

    reactor.run()
    

Вот пример автономного script, который использует DmozSpider spider и включает загрузчики товаров с процессоры ввода и вывода и конвейеры:

import json

from scrapy.crawler import Crawler
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import Join, MapCompose, TakeFirst
from scrapy import log, signals, Spider, Item, Field
from scrapy.settings import Settings
from twisted.internet import reactor


# define an item class
class DmozItem(Item):
    title = Field()
    link = Field()
    desc = Field()


# define an item loader with input and output processors
class DmozItemLoader(ItemLoader):
    default_input_processor = MapCompose(unicode.strip)
    default_output_processor = TakeFirst()

    desc_out = Join()


# define a pipeline
class JsonWriterPipeline(object):
    def __init__(self):
        self.file = open('items.jl', 'wb')

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item


# define a spider
class DmozSpider(Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        for sel in response.xpath('//ul/li'):
            loader = DmozItemLoader(DmozItem(), selector=sel, response=response)
            loader.add_xpath('title', 'a/text()')
            loader.add_xpath('link', 'a/@href')
            loader.add_xpath('desc', 'text()')
            yield loader.load_item()


# callback fired when the spider is closed
def callback(spider, reason):
    stats = spider.crawler.stats.get_stats()  # collect/log stats?

    # stop the reactor
    reactor.stop()


# instantiate settings and provide a custom configuration
settings = Settings()
settings.set('ITEM_PIPELINES', {
    '__main__.JsonWriterPipeline': 100
})

# instantiate a crawler passing in settings
crawler = Crawler(settings)

# instantiate a spider
spider = DmozSpider()

# configure signals
crawler.signals.connect(callback, signal=signals.spider_closed)

# configure and start the crawler
crawler.configure()
crawler.crawl(spider)
crawler.start()

# start logging
log.start()

# start the reactor (blocks execution)
reactor.run()

Запустите его обычным способом:

python runner.py

и наблюдать элементы, экспортированные в items.jl с помощью конвейера:

{"desc": "", "link": "/", "title": "Top"}
{"link": "/Computers/", "title": "Computers"}
{"link": "/Computers/Programming/", "title": "Programming"}
{"link": "/Computers/Programming/Languages/", "title": "Languages"}
{"link": "/Computers/Programming/Languages/Python/", "title": "Python"}
...

Здесь доступен Gist (не стесняйтесь улучшаться):


Примечания:

Если вы определяете Settings, создавая экземпляр объекта Settings(), вы получите все настройки Scrapy по умолчанию. Но если вы хотите, например, сконфигурировать существующий конвейер или настроить DEPTH_LIMIT или настроить любые другие настройки, вам нужно либо установить его в script через settings.set() (как показано в примере):

pipelines = {
    'mypackage.pipelines.FilterPipeline': 100,
    'mypackage.pipelines.MySQLPipeline': 200
}
settings.set('ITEM_PIPELINES', pipelines, priority='cmdline')

или, используя существующий settings.py со всеми настраиваемыми настройками, предварительно сконфигурированными:

from scrapy.utils.project import get_project_settings

settings = get_project_settings()

Другие полезные ссылки на эту тему: