Привет, у меня есть Python Scrapy, установленная на моем mac, и я пытался следовать v
Scrapy Очень простой пример
Ответ 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()
Другие полезные ссылки на эту тему: