2017-12-12 1 views
1

지난 18 시간 동안 필자는 코드의 버그에 대한 해결 방법을 찾기 위해 필사적으로 노력해 왔으며, 도움이 필요해.내 Scrapy/Elasticsearch 스크립트가 "serialize 할 수 없습니다"오류를 반환합니다.

웹 스크래퍼를 만들고 있는데, 그 목표는 페이지를 다운로드하고 앵커 텍스트, 내부 링크, 리퍼러 URL을 가져 와서 데이터를 DB에 저장하는 것입니다. 다음은 내 Scrapy 코드의 관련 부분입니다.

def parse_items(self, response): 
    item = InternallinkItem() 

    # Current URL 
    item["current_url"] = response.url 

    # get anchor text and clean it 
    anchor = response.meta.get('link_text') 
    item["anchor_text"] = " ".join(anchor.split()) 


    # get the referrer URL (Problem is here) 
    referring_url = response.request.headers.get('Referer') 
    item["referring_url"] = referring_url 


    yield item 

내가 사용하는 기술은 Python, Scrapy, Elasticsearch입니다. 그들은 모두 최신이며 내 dev 환경은 Windows입니다. 위의 코드를 실행하면이 오류가 발생합니다.

raise TypeError("Unable to serialize %r (type: %s)" % (data, type(data))) 

TypeError: Unable to serialize b'https://example.com' (type: <class 'bytes'>) 

많은 시행 착오 끝에 나는 그것을 추적하고 문제를 찾아 낼 수있었습니다. 리퍼러 URL을 가져 오는 부분을 제거하면 모든 것이 올바르게 작동합니다. 그것은 내가 원하는 데이터를 얻고 Elasticsearch에 성공적으로 저장합니다.

프로그래밍에 익숙하지 않은 사용자로서 진행 방법을 모릅니다.

은 또한에 주사를 놓았다,

대신 scrapy-elasticsearch 라이브러리를 사용하는, 내 자신의 파이프 라인을 작성하는 시도 .. 작동하지 않았다, 다른 방법으로 참조 URL을 잡아하려고했으나 같은 오류가 발생했습니다 유형을 바이트에서 STR로 바꾸는 것은 잘 맞았 겠지만 작동하지 않았습니다.

내가 정말로 여기에서 붙어서 어떤 도움이라도 높게 평가 될 것입니다!

편집 : 내 settings.py 파일;

ITEM_PIPELINES = { 
    'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline': 500 
} 

ELASTICSEARCH_SERVERS = ['localhost'] 
ELASTICSEARCH_INDEX = 'myindex' 
ELASTICSEARCH_TYPE = 'internallink' 
#ELASTICSEARCH_UNIQ_KEY = ['current_url'] 
+0

'scrapy-elasticsearch' 관련 치료 프로젝트 설정을 게시 하시겠습니까? – alecxe

+0

물론, @alecxe, 관련 부분에 대한 내 대답을 편집했습니다. –

+0

어둠 속에서 촬영했는데,'ELASTICSEARCH_TYPE' 설정을 주석 처리한다면 여전히 실패할까요? – alecxe

답변

1

좋아, 커피 9 컵을 소비하고 20 시간 동안 벽에 머리를 두드리는 후, 나는이 문제를 해결할 수 있었다. 너무 간단해서 여기에 게시하는 것을 거의 부끄러워하지만 여기에는 아무 것도 없습니다.

은 내가 먼저 어제 오류가 도착했을 때, 나는이

referring_url = response.request.headers.get('Referer') 
    item["referring_url"] = referring_url.decode('utf-8') 

그것은 작동하지 않았다 ...이로 변경 될 때까지 같은 레퍼러를 디코딩 시도;

referring_url = response.request.headers.get('Referer').decode('utf-8') 
    item["referring_url"] = referring_url 

왜 그런지는 모르겠지만 작동합니다.

@alecxe와 @furas 덕분에 올바른 방향으로 나를 밀어주었습니다.

관련 문제