2015-01-06 6 views
0

웹 사이트를 크롤링하기 위해 Scrapy를 사용하고 있으며, 상당히 큰 문서를 생성 중입니다. 3 가지 속성이 있으며, 그 중 하나는 5 천 개가 넘는 객체와 각각의 객체가있는 배열입니다 내부에 몇 가지 속성과 작은 배열이 있습니다. 전체적으로 파일에 쓰여진 경우 2MB를 초과해야합니다.BSON은 객체를 인코딩 할 수 없습니다.

개체를 크롤링 한 후 scrapy-mongodb 파이프 라인을 사용하여 데이터베이스로 업셋합니다. 실패 https://gist.github.com/ranisalt/ac572185e11e5918082b

(가 6 오류가 총에있는 각 개체에 대한 1 만 크롤러 출력이 너무 커서 및 절단)

그 목적 : 매번, 나는이 요지에있는 것과 같은 오류가 발생합니다 encode는 첫 번째 줄에서 언급 한 큰 배열에 있습니다.

개체를 pymongo에서 인코딩하지 못하게 할 수 있으며 내 문서에 어떤 내용이 적용될 수 있습니까? 의견

+0

문서 중 하나를 삽입하려고했는데 어떤 오류도없이 mongodb의 어떤 버전을 사용하고 있으며 데이터베이스에 문서를 어떻게 삽입하고 있습니까? –

+0

버전 2.4.6을 사용하고 있습니다. 예제는 삽입하려는 문서가 아니라 문서에 중첩 된 객체입니다. 전체 문서를 업로드하겠습니다. – ranisalt

+0

여기에 있습니다 : https://gist.github.com/ranisalt/d7320d6993664e87b7c0 이것은 삽입 될 전체 문서입니다 – ranisalt

답변

0

이 발생하는 문제에 문의하시기 바랍니다 아무것도가 필요한 경우

, 나는 믿고 완전히 파이썬에서 MongoDB를에 삽입하기 전에 UTF-8 형식으로 변환하지 이스케이프 문자 때문이다.

MongoDB 변경 로그를 확인하지 않았지만 v.2.2 이상에서 올바르게 기억한다면 전체 유니 코드를 지원해야합니다.

어쨌든 mongoDB 2.6의 최신 버전으로 업그레이드하거나 scrapy-mongodb 스크립트를 수정/덮어 쓰는 2 가지 방법이 있습니다.

# ... previous code ... 
     key = {} 
     if isinstance(self.config['unique_key'], list): 
      for k in dict(self.config['unique_key']).keys(): 
       key[k] = item[k] 
     else: 
      key[self.config['unique_key']] = item[self.config['unique_key']] 

     self.collection.update(key, item, upsert=True) 
# ... and the rest ... 

이 문제를 해결하려면, 당신은 process_item 함수 내에서이 몇 줄을 추가 할 수 있습니다 : K가 MongoDB를에 삽입하기 전에 UTF-8로 변환되지 않고,이 라인을 찾습니다 scrapy_mongodb.py을 변경하려면

# ... previous code ... 
def process_item(self, item, spider): 
    """ Process the item and add it to MongoDB 
    :type item: Item object 
    :param item: The item to put into MongoDB 
    :type spider: BaseSpider object 
    :param spider: The spider running the queries 
    :returns: Item object 
    """ 
    item = dict(self._get_serialized_fields(item)) 
    # add a recursive function to convert all unicode to utf-8 format 
    # take this snippet from this [SO answer](http://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of-unicode-ones-from-json-in-python) 
    def byteify(input): 
     if isinstance(input, dict): 
      return {byteify(key):byteify(value) for key,value in input.iteritems()} 
     elif isinstance(input, list): 
      return [byteify(element) for element in input] 
     elif isinstance(input, unicode): 
      return input.encode('utf-8') 
      # if above utf-8 conversion still not working, replace them completely 
      # return input.encode('ASCII', 'ignore') 
     else: 
      return input 
    # finally replace the item with this function 
    item = byteify(item) 
    # ... rest of the code ... # 

여전히 작동하지 않는 경우 mongodb를 최신 버전으로 업그레이드하는 것이 좋습니다.

희망이 도움이됩니다.

+0

나는 그것이 Mongo 문제라고 생각하지 않습니다. 나는 당신의 byteify 함수를 수정했다. 이전에 유니 코드 인 문자열을 "un-unicode"하는 데 도움이되었지만 이중으로 이스케이프 처리된다. 유니 코드에 대해'히스토리아 '가'Hist \ xf3ria'로 이스케이프 된 경우, 이제는'Hist \ xc3 \ xb3ria'이고, 여전히 삽입 할 수 없습니다. – ranisalt

+0

@ranisalt, 실제로 유니 코드를 제거하기 위해'.encode ('ASCII', 'ignore')'시도 했습니까? – Anzel

+0

그래, 지금 시도하고 다시 작동하지 않았다. 나는 Mongo를 갱신하려고 노력할 것이다. – ranisalt

관련 문제