인프런 커뮤니티 질문&답변

salty510님의 프로필 이미지
salty510

작성한 질문수

쉽게 처음하는 파이썬 고급 크롤링 [Scrapy, Selenium, Headless Chrome]

Scrapy 다양한 사용법: Scrapy 로 네이버 Open API 크롤링하기2

아래분(phantele47)과 동일한 문제가 발생해서 문의드립니다.

작성

·

670

0

다른 분의 질문과 같이 json.loads(response.body_as_unicode())에서 문제가 발생하는 것을 보입니다.

이전 단계(print(response.text))에서는 문제가 발생하지 않았습니다.

그런데 다음으로 특정 item 관련 data를 획득하기 위한 단계에서 문제가 발생하였습니다.  <AttributeError: 'TextResponse' object has no attribute 'body_as_unicode'>란 메세지가 보이네요.

나름 문제 해결을 위해서 구글링도 해보고 있는데 아직 정확한 해결책을 찾지 못했습니다. 더 고민해 봐야할 테지만 저만의 문제가 아닌 듯하여 일단 질문드립니다.

답변이 가능하시다면 답변 부탁드립니다.

감사합니다.

 

답변 6

1

salty510님의 프로필 이미지
salty510
질문자

안녕하세요.

일단 질문드렸던 문제는 다음과 같은 코드로 수정하니 해결이 되었습니다.

 def parse(self, response):
        data = json.loads(response.text)
        for item in data['items']:
            print(item['title'])

response.body_as_unicode()를 response.text로 변경하였습니다.

그 결과, 

이와 같은 결과가 출력되었습니다.

하지만 왜 해결되었는지는 모르겠네요.

it전문가가 아니다 보니 항상 이런 것이 문제네요.

문제가 해결이 돼도 왜 그런 것이지를 모른다는.

여하튼 혹시 이러한 결과가 빚어진 이유를 아시거나 예측되시는 부분이 있으면 알려주세요.

감사합니다.

저두 따라하니 해결은 되네요. 어쨋든 unicode 관련 함수가 안 먹히는 듯 하네요.

0

먼저 공부하시고, 질문과 해결을 해주신 선배님께 감사드립니다.

물론 엄청난 강의력과 쿼리 큘럼으로 여기까지 공부할수있게 해주신 데이브리님께는 더욱 큰 감사를 드립니다.

 

지금 시점에서 살펴보니, body_as_unicode()는 삭제되었다고합니다.

증거로 (제가 찾은게 아니라, 스택오버플로에서 어떤분이 링크함)

(영어 못합니다.. 번역기돌렸어요)

https://github.com/scrapy/scrapy/commit/55ae2109c95e497d4a730afeb9caf71aa78a7723

 

여기 보면

-	def body_as_unicode(self):
-        """Return body as unicode"""
-        warnings.warn('Response.body_as_unicode() is deprecated, '
-                      'please use Response.text instead.',
-                      ScrapyDeprecationWarning, stacklevel=2)
-        return self.text

Response.body_as_unicode() is deprecated, ' 'please use Response.text instead.

번역기 돌려보니 더이상 사용되지 않는다고 합니다

 

즉, 제뒤에 공부하시는 분들은 response.text를 사용하시면되빈다.

 

0

저도 body_as_unicode()가 안먹네요 위에써주신 text로 변경해서 실습했습니다

0

안녕하세요. 제가 질문/답변이 여러가지라서, 질문에 대한 재응답 부분까지는 보지 못하고 있었는데요.

말씀하신 부분은 메일로는 안와서, 혹시나 해서, 봤는데, 왠지 뭔가 scrapy 버그가 아닐까 하는 생각도 들었습니다. 물론 보통의 경우는 버그가 있으면, 검색해보면 유사한 이슈를 제기하는 분들이 있긴 한데, 이 부분은 딱 맞는 부분은 없더라고요.

다음 부분이 가장 유사한데... 이것도 살짝 http response 를 결국 잘 못받은거 아니냐는 이야기도 들어 있어서 딱히 힌트를 얻기는 어려웠습니다.

https://stackoverflow.com/questions/14413900/scrapy-why-does-my-response-object-not-have-a-body-as-unicode-method

 

파이썬 버전 + scrpay 버전 + json 버전의 조합에 따른 매우 특이한 이슈일 수도 있지 않을까 하는데, 어쨌든 이 부분때문에 고생하셨는데, 해결책도 알려주셔서 저도 감사합니다. 이 부분이 좀 갈리더라고요. 보통 개발자는 이런 고생을 많이 하는데요. 고생이라기보다 이런 과정속에서 여러가지 가능성을 테스트해보며 검색해보며 익히는 것이거든요. 그런데, 이게 익숙하지 않으시고, 개발이 익숙하지 않으신 분들이 가끔 이런 고생을 한번 하시면 극대노를 하시거든요. ㅎㅎㅎ 그래도 그런 과정을 논의해볼 수 있어서 저도 좋았습니다.

일단 저는 되거든요. scrapy version 이라고 치면, scrapy 버전이 나오는데 2.0.0 이고, 파이썬 버전이 좀 예전 것이긴 합니다. 3.7 정도인데, 뭔가 위의 세가지 라이브러리 간의 버전 컨플릭? 이슈인가 싶기도 한데, 이 부분은 완벽하게 확인이 어려운듯 합니다.

하지만, 이 부분은 body_as_unicode() 가 상황에 따라 안될 수 있다는 것으로 보이고요. text 로 바꿨을 때는 정상동작한다고 알려주셔서 감사하고, 죄송합니다. 해당 부분 공지도 한번 하도록 하겠습니다. 

def parse(self, response):

        data = json.loads(response.body_as_unicode())

감사합니다.

salty510님의 프로필 이미지
salty510
질문자

네.

덕분에 저도 뭔가 문제를 해결아닌 해결해봤다는 자그마한 성취감(?)을 느꼈습니다.

전에는 문제가 생기면 해결 못하고 그냥 넘어가고는 했는데,

이제 좀 더 끈기를 가져봐야겠네요.

좋은 강의 잘 듣고 있습니다.

감사합니다^^

0

salty510님의 프로필 이미지
salty510
질문자

네^^ 바쁘실텐데 감사합니다.

위에 말씀해주신 것을 포함헤서 저도 최대한 문제해결을 해보도록 하겠습니다.

해결이 되면 다시 답글을 올리도록 하겠습니다.

감사합니다.

한가지 첨부하자면 말씀대로 문제가 발생한 부분의 전단계까지는 문제가 없었다는 점에서 

client-id나 client-secret상에는 문제가 없다고 봐야할 듯 합니다.

그리고 선생님이 제공해준 CRAPY_PRACTICE5_UNDERSTAND_SCRAPY_OPENAPI.zip를 대상으로

저의 client-id와 client-secret를 적용해본 결과, 동일하게 <AttributeError: 'TextResponse' object has no attribute 'body_as_unicode'>가 발생했습니다.

시스템의 문제인지, 아니면 뭔가 프로그램상의 버전의 문제인지 모르겠네요.

여하튼 감사합니다.

0

안녕하세요.

 

사실 전에 한번 설마 하는 마음으로, 정말 아닌 것 같아서, 다시 한번 확인을 부탁드린다고 썼다가, 제가 예의가 없고, 묘하게 말을 기분나쁘게 한다고 20대 여성분께서, 수강평으로 욕을 많이 써놓으셨어요.  ㅎㅎ

당연히 저도 여러번 확인한다고 하는데, PC 환경이 워낙 다양하거나, 저도 사람인지라, 놓치는 부분이 있을 수는 있는데요. 그래도, 제가 이번에는 두 분이나 그러셔서, 전에도 테스트를 해봤습니다. 혹시라도 다음 제 과정에서 제가 놓친 부분이 또 있을 수도 잇는데, 그렇다면, 너그러히 양해를 부탁드리고, dream@fun-coding.org 로 가이드 부탁드립니다.

 

해당의 바로 전 챕터인 다음 챕터에 보면, 

- Scrapy 다양한 사용법: Scrapy 로 네이버 Open API 크롤링하기 

본 챕터에서 설명한 그대로의 마지막 코드를 첨부파일로 넣어놓았습니다.

SCRAPY_PRACTICE5_UNDERSTAND_SCRAPY_OPENAPI.zip 파일인데요.

 

여기에, 제 ID/secret 로만 코드를 업데이트하고, 기존에 있었던 navershopapi_item.json 파일을 삭제한 후,

재실행을 해보았습니다.

---------

# -*- coding: utf-8 -*-

import scrapy

import json

import re

from mynaverapi.items import MynaverapiItem

 

 

class NavershopapiItemSpider(scrapy.Spider):

    name = 'navershopapi_item'

    allowed_domains = ['openapi.naver.com/v1/search/shop.json']

    start_urls = ['https://openapi.naver.com/v1/search/shop.json']

 

    def start_requests(self):

        client_id = '저의 것'

        client_secret = '저의 것'

---------

 

그래서,  다음과 같이 새로 navershopapi_item.json 파일이 생성됨을 확인하였는데요.

[

{"title": "Apple  13 프로 256GB [자급제]"},

{"title": "Apple  13 프로 128GB [자급제]"},

{"title": "Apple  13 미니 128GB [자급제]"},

{"title": "Apple  SE3 128GB [자급제]"},

{"title": "Apple  12 미니 64GB [자급제]"},

{"title": "Apple  13 256GB [자급제]"},

{"title": "Apple  13 128GB [자급제]"},

{"title": "Apple  13 미니 256GB [자급제]"},

{"title": "Apple  13 프로 맥스 256GB [자급제]"},

{"title": "Apple  SE3 64GB [자급제]"}

]

 

혹시 챕터 몇분 몇초인지 명확히 확인이 안되긴 하지만, settings.py코드파일에 보시면, 다음 부분이 앞에 # 이 없이 기재해야 하는 부분을 이야기를 드린 부분이 있고, 제공해드린 코드파일에도 해당 코드가 그대로 기재가 되어 있는데요. 혹시 이 부분도 한번 # 없이 기재되었는지도 확인해보시면 어떠실까요?

FEED_EXPORT_ENCODING = 'utf-8'

 

또, 해당 ID/secret 의 애플리케이션 에서, API 설정에 검색 이 사용 API 로 등록신청이 된 것인지도 한번 확인해보시면 어떠실까요?

 

이것도 아니면, PC 환경 문제일 수도 있는데, 제가 맥에서 테스트를 해본 것인데, 윈도우에서만 안된다고 보기는 좀 이상할 것이, response 에 body_as_unicode() 메서드 자체가 없다는 것은, resonse 객체 자체가 데이터를 못가져와서 제대로 객체가 만들어지지 않았다는 것이거든요. 그렇다면, 이 부분은 데이터를 가져오는데 자체에 이슈가 있을 가능성이 있거나, 위 settings 의 옵션이 애매해서, 그럴수 있을 수도 있습니다.

 

최대한 저도 확인을 해본 것인데, 위와 같은 가이드를 다 확인했는데도, 안된다면, dream@fun-coding.org 로 연락주시거나, 결국 되셨다면, 가능하시다면, 본 문의의 답글로 한번 어떤 부분때문에 안되셨는지, 그리고 그래서 어떻게 해결되었는지도 기재해주시면 저도 정말 기쁠 것 같습니다.

감사합니다.

salty510님의 프로필 이미지
salty510

작성한 질문수

질문하기