블로그에 글을 작성하다보면 관련 사진을 찾아서 수십개 올려야 할 경우가 있는데,
구글에서 찾아서 하나하나 저장하면 시간이 많이 걸립니다.
그래서 저는 파이썬 2.7에 이미지 크롤링 스크립트를 작성하여 사용하고 있습니다.
스크립트를 하기에 공유합니다.
저도 인터넷에서 찾은건데, 예전하고 구글의 이미지 관련 사이트가 달라져서 디버깅을 한 버전입니다.
(전체소스는 최하단 참고)
모듈 선언부입니다. 모듈이 없으면 PIP로 추가하시면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # -*- coding: utf-8 -*- import requests import time import urllib import argparse from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.common.keys import Keys from fake_useragent import UserAgent from multiprocessing import Pool from lxml.html import fromstring import os, sys import wget no=1 | cs |
url로 검색하는 부분입니다.
크롬을 미리 깔아야하고 chromedriver를 깔아줘야합니다. 링크
하기 소스는 크롬을 실행해서 열고 매개변수로 받은 url(본 예제는 구글 이미지 검색페이지)로 들어가서
페이지 다운을 누르고 일정 시간 후, 더 보기 버튼을 자동으로 누르고 계속 페이지 다운을 하는 겁니다.
받을 양을 조정하려면 for문 숫자를 더 늘리면 됩니다. 딜레이도 맞춰주고요...
마지막엔 검색한 html을 반환하고 크롬을 종료합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | def search(url): # Create a browser browser = webdriver.Chrome('chromedriver') # Open the link browser.get(url) time.sleep(0.5) element = browser.find_element_by_tag_name("body") # Scroll down for i in range(40): element.send_keys(Keys.PAGE_DOWN) time.sleep(0.1) browser.find_element_by_id("smb").click() for i in range(10): element.send_keys(Keys.PAGE_DOWN) time.sleep(0.2) time.sleep(1) # Get page source and close the browser source = browser.page_source browser.close() return source | cs |
다음은 위에서 받은 검색한 리스트들을 받아서 이미지 부분 주소를 추출하고 저장을 합니다.
저는 이미지 부분 주소의 마지막 4자리가 .jpg인 경우에만 다운로드 되도록 했습니다.
png등을 받고 싶으시면 해당부분을 수정하시면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def download_image(link): global no #print link # Use a random user agent header headers = {"User-Agent": ua.random} # Get the image link try: r = requests.get("https://www.google.com" + link.get("href"), headers=headers) except: print("Cannot get link.") title = fromstring(r.content).findtext(".//title") link_url = title.split(" ")[-1] print link_url if link_url.find(".jpg")==len(link_url)-4: # Download the image wget.download(link_url, str(os.getcwd()) + "/" + query+"/"+str(no)+".jpg") no=no+1 | cs |
다음이 마지막인데 검색어를 cmd에서 입력받고 해당 검색어로 url를 만들어 위에서 선언한 함수에 보내주고 받는 역할을 합니다.
count변수에 입력한 숫자만큼 다운로드를 진행합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # set stack limit sys.setrecursionlimit(100000000) # get user input and search on google query = raw_input(u'검색어는?: ').decode("utf-8") #query = input("Enter the name you want to search") url = "https://www.google.com/search?as_st=y&tbs=isz%3Alt%2Cislt%3Asvga%2Citp%3Aphoto%2Cift%3Ajpg &tbm=isch&sa=1&ei=H_-KW6GSHImGoAS3z4DYCA&q=" +query+"&oq="+query+"&gs_l=img.3..0l10.19389.19389.0. 21095.1.1.0.0.0.0.113.113.0j1.1.0....0...1c.1.64.img..0.1.111....0.QpKT5Qs8Kdo" print url source = search(url) count=60 # Parse the page source and download pics page_text = source.encode('utf-8').decode('ascii', 'ignore') soup = BeautifulSoup(page_text, "html.parser") ua = UserAgent() # check directory and create if necessary if not os.path.isdir(query): os.makedirs(query) #os.chdir(str(os.getcwd()) + "/" + query) # get the links links = soup.find_all("a", class_="rg_l") for a in links[0:count]: try: download_image(a) except: pass | cs |
'IT' 카테고리의 다른 글
애드몹 테스트 광고 송출하기 (0) | 2018.09.20 |
---|---|
웨이보(WEIBO) 개발자 등록하기 (1) | 2018.09.19 |
파이썬 티스토리 API 이용 (자동토큰획득법) (3) | 2018.08.24 |
[180818] 댓글 많은 뉴스에 대한 댓글 텍스트마이닝 결과 (0) | 2018.08.19 |
중국 음악프로그램 (1) | 2009.12.27 |