TypeError при отправке скребковых данных из scrapy в elasticsearch

Я слежу за этим учебным пособием ( http://blog.florian-hopf.de/2014/07/scrapy-and-elasticsearch.html ) и используя этот путь для исследования эластичности ( https://github.com/knockrentals/scrapy -elasticsearch ) и я могу извлечь данные из scrapy в файл JSON и запустить сервер elasticsearch и запустить его на локальном хосте.

Однако, когда я пытаюсь отправить скребковые данные в elasticsearch с использованием конвейера, я получаю следующую ошибку:

2015-08-05 21:21:53 [scrapy] ERROR: Error processing {'link': [u'http://www.meetup.com/Search-Meetup-Karlsruhe/events/221907250/'], 'title': [u'Alles rund um Elasticsearch']} Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks current.result = callback(current.result, *args, **kw) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scrapyelasticsearch/scrapyelasticsearch.py", line 70, in process_item self.index_item(item) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scrapyelasticsearch/scrapyelasticsearch.py", line 52, in index_item local_id = hashlib.sha1(item[uniq_key]).hexdigest() TypeError: must be string or buffer, not list 

файл itemss.py scrapy выглядит следующим образом:

 from scrapy.item import Item, Field class MeetupItem(Item): title = Field() link = Field() description = Field() 

и (я думаю, только в соответствующей части) мой файл settings.py выглядит так:

 from scrapy import log ITEM_PIPELINES = [ 'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline', ] ELASTICSEARCH_SERVER = 'localhost' # If not 'localhost' prepend 'http://' ELASTICSEARCH_PORT = 9200 # If port 80 leave blank ELASTICSEARCH_USERNAME = '' ELASTICSEARCH_PASSWORD = '' ELASTICSEARCH_INDEX = 'meetups' ELASTICSEARCH_TYPE = 'meetup' ELASTICSEARCH_UNIQ_KEY = 'link' ELASTICSEARCH_LOG_LEVEL= log.DEBUG 

любая помощь будет принята с благодарностью!

2 Solutions collect form web for “TypeError при отправке скребковых данных из scrapy в elasticsearch”

Как вы можете видеть в сообщении об ошибке: Error processing {'link': [u'http://www.meetup.com/Search-Meetup-Karlsruhe/events/221907250/'], 'title': [u'Alles rund um Elasticsearch']} поля link и title вашего объекта являются списками (квадратные скобки вокруг значений указывают это).

Это из-за вашей экстракции в Scrapy. Вы не опубликовали его с вашим вопросом, но вы должны использовать response.xpath().extract()[0] чтобы получить первый результат списка. Естественно, в этом случае вам нужно подготовиться к пустым наборам результатов, чтобы избежать ошибок индекса.

Обновить

В ситуации, когда вы ничего не извлекаете, вы можете подготовиться со следующим:

 linkSelection = response.xpath().extract() item['link'] = linkSelection[0] if linkSelection else "" 

Или что-то подобное в зависимости от ваших данных и полей. Возможно, None не может быть действительным, если список пуст.

Основная идея состоит в том, чтобы разделить извлечение XPath и выбор списка. И вы должны выбрать элемент из списка, если он содержит необходимые элементы.

У меня такая же проблема, я следовал его инструкциям, однако у меня есть следующая ошибка:

 2015-08-06 15:00:15 [scrapy] ERROR: Spider error processing <GET http://www.meetup.com/Search-Meetup-Karlsruhe/> (referer: None) Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/scrapy/utils/defer.py", line 102, in iter_errback yield next(it) File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermiddlewares/offsite.py", line 28, in process_spider_output for x in result: File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermiddlewares/referer.py", line 22, in <genexpr> return (_set_referer(r) for r in result or ()) File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermiddlewares/urllength.py", line 37, in <genexpr> return (r for r in result or () if _filter(r)) File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermiddlewares/depth.py", line 54, in <genexpr> return (r for r in result or () if _filter(r)) File "/home/rodrigo/meetup/meetup/spiders/meetup_spider.py", line 17, in parse linkSelection = response.xpath().extract() TypeError: xpath() takes exactly 2 arguments (1 given) 

Моя конфигурация:

В items.py

 from scrapy.item import Item, Field class MeetupItem(Item): title = Field() link = Field() description = Field 

В settings.py

 from scrapy import log ITEM_PIPELINES = [ 'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline', ] ELASTICSEARCH_SERVER = 'localhost' # If not 'localhost' prepend 'http://' ELASTICSEARCH_PORT = 9200 # If port 80 leave blank ELASTICSEARCH_USERNAME = '' ELASTICSEARCH_PASSWORD = '' ELASTICSEARCH_INDEX = 'meetups' ELASTICSEARCH_TYPE = 'meetup' ELASTICSEARCH_UNIQ_KEY = 'link' ELASTICSEARCH_LOG_LEVEL= log.DEBUG 

В meetup_spider.py

 from scrapy.spider import BaseSpider from scrapy.selector import Selector from meetup.items import MeetupItem class MeetupSpider(BaseSpider): name = "meetup" allowed_domains = ["meetup.com"] start_urls = [ "http://www.meetup.com/Search-Meetup-Karlsruhe/" ] def parse(self, response): responseSelector = Selector(response) for sel in responseSelector.css('li.past.line.event-item'): item = MeetupItem() item['title'] = sel.css('a.event-title::text').extract() linkSelection = response.xpath().extract() item['link'] = linkSelection[0] if linkSelection else "" yield item 

Обновить

Я решил, что код будет:

 from scrapy.spider import BaseSpider from scrapy.selector import Selector from meetup.items import MeetupItem class MeetupSpider(BaseSpider): name = "meetup" allowed_domains = ["meetup.com"] start_urls = [ "http://www.meetup.com/Search-Meetup-Karlsruhe/" ] def parse(self, response): responseSelector = Selector(response) for sel in responseSelector.css('li.past.line.event-item'): item = MeetupItem() item['title'] = sel.css('a.event-title::text').extract() linkSelection = response.xpath('a/@href').extract() item['link'] = linkSelection[0] if linkSelection else "" yield item 

ура

  • Изменить количество запущенных пауков scrapyd
  • Запуск пауков Scrapy в задаче Сельдерея
  • Начало Scrapy Сканирование после входа в систему
  • xpath: манипуляция строк
  • Как выбрать весь текст для детей, но исключая тег с XPath Scapy?
  • Ошибка установки пула - команда python setup.py с ошибкой egg_info с кодом ошибки 1
  • Как заставить scrapy сканировать дублирующий URL?
  • Обход нескольких сайтов с помощью Python Scrapy с ограниченной глубиной на сайт
  • Python - лучший язык программирования в мире.