Как интегрировать Scrapy Web Crawler с Luigi Data Pipeline?

(Давний пользователь && Первый вопрос && Нервничает задать) Верно

В настоящее время я создаю серверную часть Python, которая будет развернута на одном экземпляре AWS EC2 со следующей архитектурой:


|---- Источники данных -----| Временное хранилище | - Обработка данных --- | ----- БД ---- |

Данные веб-краулера----*Сохранить на S3* =\
Данные API----------------- *Сохранить на S3* ==> Конвейер данных Lugi --> MongoDB


Как показано выше, у нас есть разные способы извлечения данных (например, запросы API, Scrapy Web Crawler и т. д.), но сложная/сложная часть заключается в том, чтобы найти простой и отказоустойчивый способ подключения полученных данных к Luigi. Конвейер данных.

Есть ли способ интегрировать вывод поискового робота в конвейер данных Luigi? Если нет, то как лучше всего преодолеть разрыв между сборщиками данных HTTP и задачами Luigi?

Любые советы, документы или статьи будут очень признательны! Кроме того, если вам нужны дополнительные подробности, я приведу их сюда как можно быстрее.

Благодарю вас!


person Tim S    schedule 13.06.2017    source источник


Ответы (1)


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

Аналогичный вопрос вы можете узнать здесь:Когда новый файл поступает в S3, запускает задачу luigi Возможно, вы, ребята, работаете в одном месте :).

Я настоятельно рекомендую разместить вашего паука в scrapyd и использовать scrapyd-client для управления им. Есть ВСЕ ВИДЫ волосатых вещей, которые появляются, если вы пытаетесь запустить scrapy в других инструментах, использующих скрученную библиотеку (не уверен, что luigi делает). Я бы управлял пауком с помощью scrapyd-client и позволял вашему пауку отправлять сообщения по URL-адресу триггера, который говорит Луиджи как-то запустить задачу.

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

У меня есть веб-приложение django, и я запускаю паука, сохраняю jobid из scrapyd-client и получаю прикосновение json к плечу, когда это делается, затем я использую celery и solr для приема данных.

Изменить, чтобы включить код конвейера из комментариев ниже:

        for fentry in item['files']:

            # open and read the file
            pdf = open(rootdir+os.path.sep+fentry['path'],'rb').read()

            # just in case we need cookies
            cj     = CookieJar()
            opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))

            # set the content type
            headers = {
            'Content-Type': 'application/json'
            }

            #fill out the object
            json_body = json.dumps({
            'uid'   : 'indeed-'+item['indeed_uid'],
            'url'   : item['candidate_url'],
            'first_name' : fname,
            'last_name'  : lname,
            'pdf'     : base64.b64encode(pdf).decode(),
            'jobid': spider.jobid
            }).encode()
            #, ensure_ascii=False)

            # send the POST and read the result
            request = urllib.request.Request('http://localhost:8080/api/someapi/', json_body, headers)
            request.get_method = lambda: 'POST'
            response = opener.open(request)
person RabidCicada    schedule 13.06.2017
comment
Отличный момент, я определенно хочу держаться подальше от голосования любой ценой. И последний вопрос: не могли бы вы подробнее рассказать об этом кране JSON? Это происходит, когда весь процесс сканера завершен или после того, как одна страница была выбрана и нуждается в обработке? Все еще раздумываете, начинать ли обработку после получения отдельной страницы или объединить все данные в один файл и подождать до тех пор? Тем не менее, мое внутреннее чувство говорит, что последнее является более подверженным ошибкам решением/может привести к повреждению файлов. - person Tim S; 14.06.2017
comment
Я делаю это для каждого элемента, поскольку элементы очищаются (а не в конце паука), используя конвейеры элементов в scrapy. Лучший стиль пакетной обработки/обработки полностью зависит от вашего бэкенда. Я включил большую часть моей функции process_item() из соответствующего конвейера в свой отредактированный ответ для справки. Если вы не хотите делать это для каждого элемента... вы можете экспортировать в json или csv почти изначально с помощью scrapy, а затем отправить кран на сервер, используя сигнал CloseSpider или что-то подобное. - person RabidCicada; 14.06.2017
comment
Если ваш элемент ОЧЕНЬ прост, вам не нужно использовать конвейеры, просто используйте экспортер (похожий на встроенный конвейер) doc.scrapy.org/en/latest/topics/exporters.html. Затем вы можете запустить SpiderClose или что-то еще. - person RabidCicada; 14.06.2017
comment
Если мой ответ был приемлемым... пожалуйста, примите его как официальный ответ - person RabidCicada; 16.06.2017