Мы только что выпустили новое промежуточное ПО Scrapy с открытым исходным кодом, которое упрощает интеграцию AutoExtract в существующий паук Scrapy. Если вы еще не слышали об AutoExtract, это инструмент веб-скрейпинга на основе искусственного интеллекта, который автоматически извлекает данные с веб-страниц без необходимости написания кода. Узнайте больше об AutoExtract здесь.

Установка

В этом проекте используется и. Виртуальная среда настоятельно рекомендуется.

$ pip install git+https://github.com/scrapinghub/scrapy-autoextract

Конфигурация

Включить промежуточное ПО

DOWNLOADER_MIDDLEWARES = {
    'scrapy_autoextract.AutoExtractMiddleware': 543, 
}

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

Настройки автоизвлечения

Обязательный

Эти настройки должны быть определены для работы AutoExtract.

  • AUTOEXTRACT_USER: ваш ключ API AutoExtract.
  • AUTOEXTRACT_PAGE_TYPE: тип данных для извлечения (текущие варианты: «продукт» или «статья»)

По желанию

  • AUTOEXTRACT_URL: URL службы AutoExtract (по умолчанию: autoextract.scrapinghub.com)
  • AUTOEXTRACT_TIMEOUT: время ожидания ответа от AutoExtract (по умолчанию: 660 секунд)

Паук

Запросы AutoExtract не являются обязательными, и они должны быть включены для каждого запроса, добавив:

meta['autoextract'] = {'enabled': True}

Если запрос был отправлен в AutoExtract, внутри вашего паука Scrapy вы можете получить доступ к результату AutoExtract через метаатрибут:

def parse(self, response):
    yield response.meta['autoextract']

Пример

В файле настроек Scrapy:

DOWNLOADER_MIDDLEWARES = { 'scrapy_autoextract.AutoExtractMiddleware': 543, 
} 
# Disable AutoThrottle middleware 
AUTHTHROTTLE_ENABLED = False 
AUTOEXTRACT_USER = 'my_autoextract_apikey' 
AUTOEXTRACT_PAGE_TYPE = 'article'

В пауке:

class ExampleSpider(Spider):
    name = 'example'
    start_urls = ['example.com']
    def start_requests(self):
        yield scrapy.Request(url, meta={'autoextract': {'enabled': True}}, self.parse)
    def parse(self, response):
        yield response.meta['autoextract']

Пример вывода:

[{
      "query":{
         "domain":"example.com",
         "userQuery":{
            "url":"https://www.example.com/news/2019/oct/15/lorem-dolor-sit",
            "pageType":"article"
         },
         "id":"1570771884892-800e44fc7cf49259"
      },
      "article":{
         "articleBody":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat...",
        "description":"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatu",
        "probability":0.9717171744215637,
        "inLanguage":"en",
        "headline":"'Lorem Ipsum Dolor Sit Amet",
        "author":"Attila Toth",
        "articleBodyHtml":"<article>\n\n<p>Lorem ipsum...",
        "images":["https://i.example.com/img/media/12a71d2200e99f9fff125972b88ff395f5e...",],
 "mainImage":"https://i.example.com/img/media/12a71d2200e99f9fff125972b88ff395f5e..."}
}]

Ограничения

  • Входящий запрос паука обрабатывается AutoExtract, а не просто загружается Scrapy, что может изменить результат — другой IP, другие заголовки и т. д.
  • Поддерживаются только GET-запросы.
  • Пользовательские заголовки и файлы cookie не поддерживаются (т. е. функции Scrapy для их установки не работают)
  • Прокси не поддерживаются (будут работать некорректно, сидя между Scrapy и AutoExtract, вместо AutoExtract и сайта)
  • Расширение AutoThrottle может некорректно работать для запросов AutoExtract, поскольку время AutoExtract может быть намного больше, чем время, необходимое для загрузки страницы, поэтому лучше всего использовать AUTOTHROTTLE_ENABLED=False в настройках.
  • Перенаправления обрабатываются AutoExtract, а не Scrapy, поэтому такие промежуточные программы могут не иметь никакого эффекта.
  • Повторные попытки должны быть отключены, потому что AutoExtract обрабатывает их внутри (используйте RETRY_ENABLED=False в настройках). Существует исключение, если за короткий промежуток времени отправлено слишком много запросов, и AutoExtract возвращает HTTP-код 429. В этом случае лучше всего использовать RETRY_HTTP_CODES. =[429].

Первоначально опубликовано на https://blog.scrapinghub.com 15 октября 2019 г.