본문 바로가기

python

31. 웹크롤링[이미지]

728x90
반응형

 

이미지 스크롤링을 하려면 필요한 내용 2가지

 

1. selenium 설치

conda install selenium

 

2. 크롬 드라이버 (크롬으로 스크롤링)

 

 

 

 

 

선생님이 주신 코드

 

 

import  urllib.request

 

from  bs4  import  BeautifulSoup

 

from selenium import webdriver

 

from selenium.webdriver.common.keys import Keys

 

import time

 

binary = 'D:\chromedriver/chromedriver.exe'

 

browser = webdriver.Chrome(binary)

 

browser.get("https://search.naver.com/search.naver?where=image&sm=stb_nmr&")

 

elem = browser.find_element_by_id("nx_query")

#네이버 검색창 소스보면(검색창의 안쪽에다가 해야함)

 #id="nx_query" 뜸.

 

 

 

#find_elements_by_class_name("")

 

 

 

 

# 검색어 입력

 

elem.send_keys("공유")  #위에 nu_query 에 들어감

 

elem.submit()  #얘가 엔터역할

 

 

 

 

# 반복할 횟수

 

for i in range(1,20):

 

    browser.find_element_by_xpath("//body").send_keys(Keys.END)

    # end 는 우리 키보드의 엔드키. 엔드키 range로 19번 먹임.

 

 

    time.sleep(10)

 

 

time.sleep(10)

 

html = browser.page_source

 

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

 

print(soup)

 

print(len(soup))

 

 

 

 

def fetch_list_url():

 

    params = []

 

    imgList = soup.find_all("img", class_="_img")

 

    for im in imgList:

 

        params.append(im["src"])

 

    return params

 

#print(fetch_list_url())

def  fetch_detail_url():

 

    params = fetch_list_url()

 

    #print(params)

 

    a = 1

 

    for p in params:

 

        # 다운받을 폴더경로 입력

 

        urllib.request.urlretrieve(p, "d:/naverImages/"+ str(a) + ".jpg" )

        a=a+1

 

 

 

 

       

 

fetch_detail_url()

 

 

 

 

browser.quit()

 

 

 

 

 

 

문제394. 구글에서 이미지 검색하는 웹스크롤링 코드를 작성하시오

 

import  urllib.request

 

from  bs4  import  BeautifulSoup

 

from selenium import webdriver

 

from selenium.webdriver.common.keys import Keys

 

import time

 

binary = 'D:\chromedriver/chromedriver.exe'

 

browser = webdriver.Chrome(binary)

 

browser.get("https://www.google.co.kr/imghp?hl=ko&tab=wi")

 

elem = browser.find_element_by_class_name("gLFyf")

#네이버 검색창 소스보면(검색창의 안쪽에다가 해야함)

 #id="nx_query" 뜸.

 #다른 사이트는 소스 찾아서 바꿔줘야 함.

 

 

 

#find_elements_by_class_name("")

 

 

 

 

# 검색어 입력

 

elem.send_keys("인간카누")  #위에 nu_query 에 들어감

 

elem.submit()  #얘가 엔터역할

 

 

 

 

# 반복할 횟수

 

for i in range(1,3):  #20으로 하면 오래 걸리니까 내려줌

 

    browser.find_element_by_xpath("//body").send_keys(Keys.END)

    # end 는 우리 키보드의 엔드키. 엔드키 range로 19번 먹임.

 

 

    time.sleep(5)  #10초는 무쟈게 오래걸린다함
 

 

time.sleep(5)

 

html = browser.page_source

 

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

 

#print(soup)

 

print(len(soup))

 

 

 

 

def fetch_list_url():

 

    params = []

 

    imgList = soup.find_all("img", class_="rg_ic rg_i")

 

    for im in imgList:

        try:

            params.append(im["src"])

       

        except KeyError:

            params.append(im["data-src"])  #어떤건 data-src 되어있다함

            #data-src 폴더에 안담고 넘어가지 않고, 에러나서 멈추나봄.

    return params

 

#print(fetch_list_url())

def  fetch_detail_url():

 

    params = fetch_list_url()

 

    #print(params)

 

    a = 1

 

    for p in params:

 

        # 다운받을 폴더경로 입력

 

        urllib.request.urlretrieve(p, "d:/naverImages/"+ str(a) + ".jpg" )

        a=a+1

 

fetch_detail_url()

 

browser.quit()

 

 

-------------------------

선생님

 

import urllib.request

from  bs4 import BeautifulSoup

from selenium import webdriver  # 웹 애플리케이션의 테스트를 자동화하기 위한 프레임 워크

from selenium.webdriver.common.keys import Keys

import time                     # 중간중간 sleep 을 걸어야 해서 time 모듈 import

 

########################### url 받아오기 ###########################

 

# 웹브라우져로 크롬을 사용할거라서 크롬 드라이버를 다운받아 위의 위치에 둔다

# 팬텀 js로 하면 백그라운드로 실행할 수 있음

binary = 'd:\chromedriver/chromedriver.exe'

 

# 브라우져를 인스턴스화

browser = webdriver.Chrome(binary)

 

# 네이버의 이미지 검색 url 받아옴(아무것도 안 쳤을때의 url)

browser.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&ei=l1AdWbegOcra8QXvtr-4Cw&ved=0EKouCBUoAQ")

 

# 네이버의 이미지 검색에 해당하는 input 창의 id 가 'nx_query' 임(검색창에 해당하는 html코드를 찾아서 elem 사용하도록 설정)

# input창 찾는 방법은 원노트에 있음

 

# find_elements_by_class_name("") --> 클래스 이름으로 찾을때는 이렇게

 

elem = browser.find_element_by_name("q")

 

 

########################### 검색어 입력 ###########################

 

# elem 이 input 창과 연결되어 스스로 아이언맨을 검색

elem.send_keys("서브웨이 샌드위치")

# 웹에서의 submit 은 엔터의 역할을 함

elem.submit()

 

########################### 반복할 횟수 ###########################

 

# 스크롤을 내리려면 브라우져 이미지 검색결과 부분(바디부분)에 마우스 클릭 한번 하고 End키를 눌러야함

for i in range(1, 5):

    browser.find_element_by_xpath("//body").send_keys(Keys.END)

    time.sleep(10)                  # END 키 누르고 내려가는데 시간이 걸려서 sleep 해줌

   

 

time.sleep(10)                      # 네트워크 느릴까봐 안정성 위해 sleep 해줌

 

 

html = browser.page_source         # 크롬브라우져에서 현재 불러온 소스 가져옴

soup = BeautifulSoup(html, "html.parser") # html 코드를 검색할 수 있도록 설정

 

 

########################### 그림파일 저장 ###########################

 

 

def fetch_list_url():

    params = []

    imgList = soup.find_all("img", class_="rg_ic rg_i")  # 네이버 이미지 url 이 있는 img 태그의 _img 클래스에 가서

    for im in imgList:

        try :

            params.append(im["src"])                   # params 리스트에 image url 을 담음

        except KeyError:

            params.append(im["data-src"])

    return params

 

 

 

def fetch_detail_url():

    params = fetch_list_url()

 

    for idx,p in enumerate(params,1):  #인덱스1번부터 시작하라는 !!

        # 다운받을 폴더경로 입력

        urllib.request.urlretrieve(p, "D:/googleImages/" + str(idx) + ".jpg")

 

if __name__ == '__main__':

    # 메인 실행 함수

    fetch_detail_url()

 

    # 끝나면 브라우져 닫기

    browser.quit()

 

------------------------------------------

구글에서 사진 찾다보면

하단에

사진더보기 나오는데

이걸 클릭하는 명령이 없다.

(end 엔터치는 명령만 있음)

 

그걸 수정보완하기 위한 준하 코드

import  urllib.request

from  bs4  import  BeautifulSoup

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import time

 

binary = 'C:\\Users\itwill\Desktop\chromedriver/chromedriver.exe'

browser = webdriver.Chrome(binary)

browser.get("https://www.google.co.kr/imghp?hl=ko")

elem = browser.find_element_by_class_name("gLFyf") #검색창 id

 

# find_elements_by_class_name("")

 

# 검색어 입력

 

elem.send_keys("subway")

elem.submit()

 

# 반복할 횟수

 

for i in range(1 ,10):

    browser.find_element_by_xpath("//body").send_keys(Keys.END)

#모두의 코드와 동일한데 거기다 try,except 하나 추가했음

    try:

        browser.find_element_by_id("smb").click()

         #smb는 결과더보기. 그걸 클릭!

        #사진 뽑다보면

        time.sleep(5)

    except:

        time.sleep(5)

time.sleep(5)

html = browser.page_source

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

 

 

def fetch_list_url():

    params = []

    imgList = soup.find_all("img", class_ ="rg_ic rg_i")

 

    for im in imgList:

        try:

            params.append(im["src"])

        except KeyError:

            params.append(im["data-src"])

 

    return params

 

def  fetch_detail_url():

    params = fetch_list_url()

    # print(params)

 

    a = 1

 

    for p in params:

        # 다운받을 폴더경로 입력

        urllib.request.urlretrieve(p, "C:\\Users\itwill\Desktop\\naverImages/ "+ str(a) + ".jpg" )

        a+=1

 

fetch_detail_url()

browser.quit()

 

 

 

 

문제395.

다음 이미지 검색에서 햄버거로 검색했을 나오는 이미지들을

D 드라이브 밑에 daumImages 라는 폴더에 저장되게 하시오

 

import  urllib.request

 

from  bs4  import  BeautifulSoup

 

from selenium import webdriver

 

from selenium.webdriver.common.keys import Keys

 

import time

 

binary = 'D:\chromedriver/chromedriver.exe'

 

browser = webdriver.Chrome(binary)

 

browser.get("https://search.daum.net/search?w=img&nil_search=btn&DA=NTB&enc=utf8&q=")

 

elem = browser.find_element_by_id("q")

#네이버 검색창 소스보면(검색창의 안쪽에다가 해야함)

 #id="nx_query" 뜸.

 #다른 사이트는 소스 찾아서 바꿔줘야 함.

 

 

 

#find_elements_by_class_name("")

 

 

 

 

# 검색어 입력

 

elem.send_keys("햄버거")  #위에 nu_query 에 들어감

 

elem.submit()  #얘가 엔터역할

 

 

 

 

# 반복할 횟수

 

for i in range(1,3):

 

    browser.find_element_by_xpath("//body").send_keys(Keys.END)

    # end 는 우리 키보드의 엔드키. 엔드키 range로 19번 먹임.

 

 

    time.sleep(5)

 

 

time.sleep(5)

 

html = browser.page_source

 

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

 

#print(soup)

 

print(len(soup))

 

 

 

 

def fetch_list_url():

 

    params = []

 

    imgList = soup.find_all("img", class_="thumb_img")

 

    for im in imgList:

        try:

            params.append(im["src"])

       

        except KeyError:

            params.append(im["data-src"])

           

    return params

 

#print(fetch_list_url())

def  fetch_detail_url():

 

    params = fetch_list_url()

 

    #print(params)

 

    a = 1

 

    for p in params:

 

        # 다운받을 폴더경로 입력

 

        urllib.request.urlretrieve(p, "d:/daumImages/"+ str(a) + ".jpg" )

        a=a+1

 

fetch_detail_url()

 

browser.quit()

 

 

 

 

 

문제395.

Bing 에서 이미지 검색을 조회했을 나오는 이미지들을

d 드라이브 밑에 bing 폴더 저장하시오

 

import  urllib.request

 

from  bs4  import  BeautifulSoup

 

from selenium import webdriver

 

from selenium.webdriver.common.keys import Keys

 

import time

 

binary = 'D:\chromedriver/chromedriver.exe'

 

browser = webdriver.Chrome(binary)

 

browser.get("https://www.bing.com/?scope=images&FORM=Z9LH1")

 

elem = browser.find_element_by_id("sb_form_q")

#네이버 검색창 소스보면(검색창의 안쪽에다가 해야함)

 #id="nx_query" .

 #다른 사이트는 소스 찾아서 바꿔줘야 함.

 

#find_elements_by_class_name("")

 

# 검색어 입력

 

elem.send_keys("코카콜라")  #위에 nu_query 에 들어감

 

elem.submit()  #얘가 엔터역할

 

# 반복할 횟수

 

for i in range(1,3):

 

    browser.find_element_by_xpath("//body").send_keys(Keys.END)

    # end 우리 키보드의 엔드키. 엔드키 range 19번 먹임.

 

 

    time.sleep(5)

 

 

time.sleep(5)

 

html = browser.page_source

 

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

 

#print(soup)

 

print(len(soup))

 

 

def fetch_list_url():

 

    params = []

 

    imgList = soup.find_all("img", class_="mimg")

 

    for im in imgList:

        try:

            params.append(im["src"])

       

        except KeyError:

            params.append(im["data-src"])

           

    return params

 

#print(fetch_list_url())

def  fetch_detail_url():

 

    params = fetch_list_url()

 

    #print(params)

 

    a = 1

 

    for p in params:

 

        # 다운받을 폴더경로 입력

 

        urllib.request.urlretrieve(p, "d:/daumImages/"+ str(a) + ".jpg" )

        a=a+1

 

fetch_detail_url()

 

browser.quit()

 


--------------

다른사람답

 

import  urllib.request

from  bs4  import  BeautifulSoup

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import time

 

binary = 'd:\chromedriver/chromedriver.exe'

browser = webdriver.Chrome(binary)

browser.get("https://www.bing.com/?scope=images&FORM=Z9LH1")

elem = browser.find_element_by_name("q")

#find_elements_by_class_name("")

 

# 검색어 입력

 

elem.send_keys("사막여우")

elem.submit() #검색버튼 실행/엔터

 

 

# 반복할 횟수

 

for i in range(1,5):

    browser.find_element_by_xpath("//body").send_keys(Keys.END)

    try:

        browser.find_element_by_id("smb").click() #결과 더보기 란 클릭 필요 없이 자동 넘어가는 기능

        time.sleep(5)

    except:

        time.sleep(5)

 

time.sleep(5)

html = browser.page_source

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

 

print(soup)

print(len(soup))

 

 

def fetch_list_url():

    params = []

    imgList = soup.find_all("img", class_="mimg")

    for im in imgList:

        try:

            params.append(im["src"])

        except KeyError:

            params.append(im["data-src"])  #중간 중간 src가 아닌 data-src인 이미지들이 있음

       

    return params

 

def  fetch_detail_url():

    params = fetch_list_url()

   

 

    #print(params)

    a = 1

    for p in params:

        # 다운받을 폴더경로 입력

        urllib.request.urlretrieve(p, "d:/bing/"+ str(a) + ".jpg" )

        a+=1     

 

fetch_detail_url()

browser.quit()

 

 

 

웹스크롤링

1. ebs 레이디버그 게시판

2. 한겨레 신문사

3. 중앙일보 신문사

4. 동아일보 신문사

5. 네이버 이미지 스크롤링

6. 구글 이미지 스크롤링

7. 다음 이미지 스크롤링

8. 이미지 스크롤링

 

 

 

문제397.(오늘의 마지막 문제)

인스타그램에서 이미지를 다운로드 받는 웹스크롤링코드를 작성하시오

 

***나는 페이스북에서 로그인하는거 까지 해보겠다!!

 

import urllib.request

from  bs4 import BeautifulSoup

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import time

 

binary = 'D:\chromedriver/chromedriver.exe'

 

driver = webdriver.Chrome(binary)

 

driver.get("https://www.facebook.com/login.php?skip_api_login=1&api_key=124024574287414&signed_next=1&next=https%3A%2F%2Fwww.facebook.com%2Fv1.0%2Fdialog%2Foauth%3Fredirect_uri%3Dhttps%253A%252F%252Fwww.instagram.com%252Faccounts%252Fsignup%252F%26state%3D%257B%2522fbLoginKey%2522%253A%25221eyxfnz13skl0m2et7ws1egfreq1pqnng71odx57ycmhzfky8zlb4%2522%252C%2522fbLoginReturnURL%2522%253A%2522%252Fexplore%252F%2522%257D%26scope%3Demail%26response_type%3Dcode%252Cgranted_scopes%26client_id%3D124024574287414%26ret%3Dlogin%26logger_id%3De57ef852-905b-f360-1163-cd36382758bd%26nonce%3DAXRGfRrj3dnAB7cX&cancel_url=https%3A%2F%2Fwww.instagram.com%2Faccounts%2Fsignup%2F%3Ferror%3Daccess_denied%26error_code%3D200%26error_description%3DPermissions%2Berror%26error_reason%3Duser_denied%26state%3D%257B%2522fbLoginKey%2522%253A%25221eyxfnz13skl0m2et7ws1egfreq1pqnng71odx57ycmhzfky8zlb4%2522%252C%2522fbLoginReturnURL%2522%253A%2522%252Fexplore%252F%2522%257D%23_%3D_&display=page&locale=ko_KR&logger_id=e57ef852-905b-f360-1163-cd36382758bd&nonce=AXRGfRrj3dnAB7cX")

#그냥 링크일뿐 쫄지마셈

 

driver.find_element_by_name("email").clear()

driver.find_element_by_name("email").send_keys("아이디 또는 이메일")

driver.find_element_by_name("pass").clear()

driver.find_element_by_name("pass").send_keys("비밀번호")

 

driver.find_element_by_id("loginbutton").submit()

#driver.find_element_by_xpath("//span[@id='react-root']/div/article/div/div/div/form/span/button").click()

time.sleep(5)

# 검색어 입력

driver.get("https://www.instagram.com/explore/")

driver.find_element_by_css_selector("div._etslc").click()

elem = driver.find_element_by_css_selector("input._9x5sw._qy55y")

elem.clear()

elem.send_keys("포켓몬")

time.sleep(10)

elem.send_keys(Keys.ENTER)

 

time.sleep(10)

 

# 반복할 횟수

for i in range(1, 3):

    driver.find_element_by_xpath("//body").send_keys(Keys.END)

    time.sleep(5)

 

time.sleep(10)

html = driver.page_source

soup = BeautifulSoup(html, "lxml")

 

 

def fetch_list_url():

    params = []

    imgList = soup.find_all("img", class_="_icyx7")

    for im in imgList:

        params.append(im["src"])

    return params

    # print(params)

 

 

def fetch_detail_url():

    params = fetch_list_url()

    # print(params)

    a = 1

    for p in params:

        # 다운받을 폴더경로 입력

        urllib.request.urlretrieve(p, "D:/naverImages/" + str(a) + ".jpg")

        # download_web_images(p,'d:\');

        a = a + 1

 

 

fetch_detail_url()

 

driver.quit()

 

------------------------

인스타그램에서 로그인은 안하고, 사진만 저장하는 코딩

 

# D:\instaImages

# https://www.instagram.com/jun2lov_sohyun/

 

import  urllib.request

from  bs4  import  BeautifulSoup

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import time

import sys

 

binary = 'D:\\chromedriver\chromedriver.exe'

browser = webdriver.Chrome(binary)

browser.get("https://www.instagram.com/jun2lov_sohyun/")

# elem = browser.find_element_by_id("sb_form_q")

#find_elements_by_class_name("")

 

# 검색어 입력

# elem.send_keys("빙그레")

# elem.submit()

 

time.sleep(2)

# 반복할 횟수

for i in range(1,2):

    browser.find_element_by_xpath("//body").send_keys(Keys.END)   

    time.sleep(2)

 

# time.sleep(5)

html = browser.page_source

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

 

print(soup)

print(len(soup))

 

def fetch_list_url():

    params = []

    imgList = soup.find_all("img", class_="FFVAD")

    for im in imgList:

        try:

                params.append(im["src"])

        except:

                print("case", im["data-src"])

                params.append(im["data-src"])

    return params

 

def fetch_detail_url():

    params = fetch_list_url()

    print(params)

    a = 1

    for p in params:

        # 다운받을 폴더경로 입력

        # print(a)

        urllib.request.urlretrieve(p, "d:/naverImages/"+ str(a) + ".jpg" )

        a += 1

     

 

fetch_detail_url()

browser.quit()

 

sys.exit()

 

---------------------

클릭+인스타 검색_ 성호코드

import  urllib.request

from  bs4  import  BeautifulSoup

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import time

 

binary = 'd:\chromedriver.exe'

browser = webdriver.Chrome(binary)

browser.get("https://www.instagram.com/instagram/")

time.sleep(5)

browser.find_element_by_class_name("TqC_a").click()

time.sleep(5)

browser.find_element_by_css_selector("input.XTCLo.x3qfX").clear()

browser.find_element_by_css_selector("input.XTCLo.x3qfX").send_keys('#에일리')

time.sleep(5)

browser.find_element_by_css_selector("input.XTCLo.x3qfX").send_keys(Keys.ENTER)

browser.find_element_by_css_selector("input.XTCLo.x3qfX").send_keys(Keys.ENTER)

time.sleep(5)

# 반복할 횟수

for i in range(1 ,3):

    browser.find_element_by_xpath("//body").send_keys(Keys.END)

    time.sleep(5)

 

 

time.sleep(5)

html = browser.page_source

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

#print(soup)

#print(len(soup))

 

def fetch_list_url():

    params = []

    imgList = soup.find_all("img", class_="FFVAD")

    for im in imgList:

        params.append(im["src"])

    return params

 

def  fetch_detail_url():

    params = fetch_list_url()

    #print(params)

    a = 1

    for p in params:

        # 다운받을 폴더경로 입력

        urllib.request.urlretrieve(p, "d:/instagram_Images/"+ str(a) + ".jpg" )

        a += 1

fetch_detail_url()

 

browser.quit()

 

 


728x90
반응형