강의

멘토링

커뮤니티

Inflearn Community Q&A

seungvictor's profile image
seungvictor

asked

Introduction to Python and Creating Various Automated Applications Using Web Crawling

BeautifulSoup usage and simple web parsing practice (2) - Naver, Inflearn

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

Resolved

Written on

·

546

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

python웹-크롤링

Answer 3

1

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

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

스크롤 없이 보이는것만 다운로드되는거라 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

niceman님의 프로필 이미지
niceman
Instructor

안녕하세요.

https://www.urldecoder.org/

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

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

아래 링크를 확인하세요!

https://jsikim1.tistory.com/219

0

niceman님의 프로필 이미지
niceman
Instructor

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

seungvictor's profile image
seungvictor

asked

Ask a question