Scrapy: разница между простым пауком и тем, у кого есть ItemLoader - PullRequest
0 голосов
/ 14 сентября 2018

Я работаю над скрапом уже 3 месяца.для извлечения селекторов я использую простой response.css или response.xpath ..

Меня просят переключиться на ItemLoaders и использовать add_xpath add_css и т. д.

Я знаю, как работают ItemLoaders и насколько они удобныНо кто-нибудь может сравнить эти 2 по эффективности?какой способ эффективен и почему ??

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

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

Допустим, у вас есть проект Scrapy для очистки данных от нескольких-commerces.У вас будет несколько пауков (скорее всего, по одному для каждого веб-сайта), но все они будут использовать одну и ту же схему для данных, которые вы извлекаете.Допустим, ваш класс ProductItem выглядит следующим образом:

class ProductItem(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    ...

Теперь предположим, что на некоторых веб-сайтах поле price содержит запятые в качестве разделителей в цене, например 1,459.99.Если вы хотите избавиться от этой запятой, чтобы стандартизировать вывод для этого поля, вам придется смешивать логику форматирования внутри вашего паука, и это может легко привести к путанице.

Если вы создаете ItemLoader для вашего ProductItem класса вы можете определить процессоры для каждого поля, чтобы вам не приходилось добавлять код форматирования в свои пауки.Примерно так:

from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose

class ProductItemLoader(ItemLoader):
    default_item_class = ProductItem
    # an input processor for your price field
    price_in = MapCompose(lambda x: x.replace(',', ''))

Теперь, когда вы используете это в своих пауках:

loader = ProductItemLoader(response=response)
loader.add_css('price', '#price::text')
...
yield loader.load_item()

Будет вызываться процессор ввода для поля price для форматирования поля дляyou.

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

TL; DR: *Загрузчики предметов 1029 * - это удобство, которое Scrapy предлагает, чтобы помочь вам лучше организовать своих пауков, избегая смешивания правил форматирования (например) в вашем коде паука.

0 голосов
/ 14 сентября 2018

Загрузчики предметов делают то же самое, что и вы, когда вы их не используете.Таким образом, для каждого loader.add_css/add_xpath вызова будет выполняться responce.css/xpath.Это не будет быстрее, и небольшое количество дополнительной работы, которую они выполняют, на самом деле не замедлит работу (особенно по сравнению с разбором xml и загрузкой по сети / io).

...