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

Seung Park님의 프로필 이미지
Seung Park

작성한 질문수

파이썬 입문 및 웹 크롤링을 활용한 다양한 자동화 어플리케이션 제작하기

BeautifulSoup 사용법 및 간단 웹 파싱 실습(2) - 네이버, 인프런

2-8-1 네이버이미지 크롤링 질문

해결된 질문

작성

·

276

1

안녕하세요 

셀레니움을 사용하지 않고 크롤링하는법을 익히기 위해 강의를 수강하였습니다

네이버이미지가 강의때와는 달리 별도로 요청해서 가져오는바람에 html을 파서하는 형태로는 받을수가 없는것같아요

셀레니움사용은 가급적이면 안하려고하는데 

혹시 크롤링할수있는방법이있을까요??

html분석해보니 이미지소스가

https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles.naver.net%2FMjAyMTExMjhfNzEg%2FMDAxNjM4MDU2NzQ5NDk3.3rzWIhB9n__9SSWJp-fF0uA4q3-AoGkVvfwt6hpqYm0g.eewDi5b-CXppMeJ_yHTN9vHtovtZNno54OUWU9kMrf0g.JPEG.daa2727%2FIMG_4606.jpg&type=a340

위에건데 html parser했을때는 아래처럼 encoding되어서 보이더라구요 이걸 decoding할수있으면 받을수있을것같은데 방법을 잘모르겠습니다 

https%3A%2F%2Fsearch.pstatic.net%2Fcommon%2F%3Fsrc%3Dhttp%253A%252F%252Fblogfiles.naver.net%252FMjAyMTExMjhfNzEg%252FMDAxNjM4MDU2NzQ5NDk3.3rzWIhB9n__9SSWJp-fF0uA4q3-AoGkVvfwt6hpqYm0g.eewDi5b-CXppMeJ_yHTN9vHtovtZNno54OUWU9kMrf0g.JPEG.daa2727%252FIMG_4606.jpg%26type%3Dsc960_832

답변 3

1

Seung Park님의 프로필 이미지
Seung Park
질문자

말씀해주신 디코드코드를 활용하여 셀레니움 없이 이미지 다운로드 만들어봤습니다 

스크롤 없이 보이는것만 다운로드되는거라 49~50개정도 다운되더라구요

브라우저를 스크롤 한 이후에 파서하면 더 다운로드될것같습니다 

셀레니움없이 스크롤도 가능할까요???

궁극적으로는 네이버 이미지검색에 직접 "사자" 같은 query를 날려서 

결과를 받아오는 방법을 알고 싶습니다 

from bs4 import BeautifulSoup
import urllib.request as req
import urllib.parse as rep
import sys
import io
import os
from urllib import parse

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')

opener = req.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
req.install_opener(opener)

base = "https://search.naver.com/search.naver?where=image&sm=tab_jum&query="
quote = rep.quote_plus("사자")
url = base + quote

res = req.urlopen(url)
savePath = "./imagedown"  # C:\imagedown\

try:
    if not (os.path.isdir(savePath)):
        os.makedirs(os.path.join(savePath))
except OSError as e:
    if e.errno != errno.EEXIST:
        print("폴더 만들기 실패!")
        raise

soup = BeautifulSoup(res, "html.parser")


# naver 이미지 검색결과에서 이미지url parser하기
a = soup.select("#main_pack > script:nth-child(10)")
b = a[0].text
c = b.split(",")
d = [x.strip() for x in c]
e = [x for x in d if x.startswith("\"originalUrl\":")]
f = [x.replace("\"", "") for x in e]
img_list = []
for i in range(len(f)):
    encoded_url =f[i].split(":")[1]
    #parser한 이미지 url decoding하기
    decoded_url = parse.unquote(encoded_url, encoding="utf-8")
    img_list.append(decoded_url)



for i, img_list in enumerate(img_list, 1):
   
    fullFileName = os.path.join(savePath, savePath + str(i) + '.jpg')
    req.urlretrieve(img_list, fullFileName)

print("다운로드 완료")

1

좋은사람님의 프로필 이미지
좋은사람
지식공유자

안녕하세요.

https://www.urldecoder.org/

사이트에서 위 주소를 붙여넣으신 후 decode 누르시면 원래 주소를 확인하실 수 있어요.

그 후 python에서 이에 맞게 코드를 작성하시면 됩니다.

아래 링크를 확인하세요!

https://jsikim1.tistory.com/219

0

좋은사람님의 프로필 이미지
좋은사람
지식공유자

가능하긴 한데 결국 selenium 등 비슷한 패키지 등을 사용하게 되실거예요~~

Seung Park님의 프로필 이미지
Seung Park

작성한 질문수

질문하기