컬러콥을 사용하고는 신세계가 열렸었다.ㅋㅋ

 

ppt 만들때나, 문서작성, 디자인 등등에 유용한 색상 추출 프로그램을 소개하려 한다.

 

뭐 이미 유명한 프로그램이겠지만 ㅎㅎㅎㅎㅎ

 

 

colorcop.net/download/

 

download

The easiest way to install Color Cop is to download the self-installing version. If you use the installer it's easy to remove the application by using add/remove programs under Windows. Standalone 5.4.6 BETA beta.zip I have a new version here, but I'd like

colorcop.net

 

color cop(컬러콥)이라는 프로그램인데, 굉장히 가볍고, 편리하다. 

RGB 값도 각각 보여줘서 정말 좋다 ㅎㅎㅎㅎ

코딩할 때는 주로 hex코드를 바로 이용하고, ppt의 경우는 rgb값을 입력하면 된다.

 

 

# 번외로 종종 컬러콥의 스포이드가 정확하게 안먹을때가 있다.

나는 분명 노란색 부분을 마우스로 가져다 댔는데,, 색이 이상하게 뽑힐때..

 

1. colorcop의 파일 위치를 열어주세요

 

2. ColorCop.exe 우클릭 - 호환성문제해결 클릭

3. 문제해결 시작~~

 

 

다음다음 누르다보면 해결이 된다.

혹시 사용하다가 잘 되었었는데, 또 갑자기 안된다면 종종 한번씩 해결사를 불러주면 된다.

 

지금 작성하는 글의 url을 캡쳐해보았다.

 

뒤쪽에 보면 ? 로 시작해서 & 로 이어지는 글자들이 보인다.

type = post

returnURL= %2Fmanage%2Fpost%2F

 

위의 경우는 이처럼 2가지의 쿼리 파라미터를 가지고 있다고 볼 수 있다.

 

그럼 html 상에서 위의 쿼리파라미터를 변수로 가져와서 사용하는 방법을 소개하겠다.

 

$(document).ready(function() {
            var param_type = new URLSearchParams(location.search).get('type');
            var param_returnURL = new URLSearchParams(location.search).get('returnURL');
            console.log("param_type은? ", param_type);
            console.log("param_returnURL은? ", param_returnURL);
}

 

 

 

 

URLSearchParams를 사용해서 바로바로 key와 value를 뽑아쓸 수 있다.

 

웹 디자인을 하다보면 가장 많이 쓰는데 또 맨날 까먹는 것 중에 하나가 바로 가운데 정렬이다.

 

무의식적으로 바로 text-align : center 사용하고는

 

아 왜 안되지?

 

그다음은 이제, vertical-align : middle 사용하고는

 

아 왜 안되지?

 

 

무한 반복하다가, 아 맞다....하고는 최후의 수단? 만병통치약으로 사용하는 것이 바로 position을 사용한 가운데 정렬이다.

 

 

 

<html>
<div class="a_box">
   <div class="b_box">
    	안녕?
    </div>
</div>
</html>

<style>
.a_box{
	position: relative;
    }
.b_box{
	position: absolute;
    top: 50%;
    left : 50%;
    transform: translate(-50%, -50%);
}
</style>

 

레알 만병통치약이다.

 

부모 클래스에는 position : relative;

자식 클래스에는 position : absolute; top: 50%; left : 50%; transform: translate(-50%, -50%);

한줄에 여러가지 색깔을 사용하려면 꼭 써줘야하는 css 속성이 있다.

 

오늘 해볼 것은 한줄에 여러가지 두가지 색상을 표현하고,

또 추가로 마우스를 가져다 대면 (hover) 색이 변하는 css를 구현해보려 한다.

 

like this -> 

 

가장 중요한 것은 바로바로 !!!

display : inline-block 을 넣어 주는 것이다.

 

그리고 hover 속성을 전체 묶어주는 div에 주어야 마우스를 가져다 대면 동시에 모든 색상이 변할 수 있다.

 

hover 속성을 main_titl_1:hover / main_titl_2:hover

이런식으로 따로따로 주게 되면 글자를 반 나눠서 왼쪽 반에 가져다 대면 왼쪽만 바뀌고, 

오른쪽에 가져다 대면 오른쪽만 바뀌게 된다.

(이런 효과를 원한다면 이렇게 따로따로 hover를 매기세요~)

 

 

 

<style>
#home_btn{
font-size: 40px;
}
.main_titl_1{
  color : #f5df4d;
  display: inline-block;
}
.main_titl_2{
  color : #0a174e;
  display: inline-block;
}
#home_btn:hover .main_titl_1 { color : #0a174e; border : none; }
#home_btn:hover .main_titl_2 { color : #f5df4d; border : none;}
</style>


<html>
<a href="/home" id="home_btn">
        <div class="main_titl_1">안</div>
        <div class="main_titl_2">녕</div>
</a>
</html>

 

ajax로 데이터를 불러와서 innerHtml로 신나게 때려박았다.

 

그리고는 다음 javascript에서 innerHtml로 박아 넣은 div의 id를 가져다 쓰려는데,,, 불러오지를 못했다.

<script>
$(".project_list").click(function () {
	alert("hello");
}
</script>

<body>
	<div id ="project_list">
		일번 프로젝트
	</div>
</body>

위의 코드로는 아무리 project_list를 눌러도 눌러지지 않는다..

(ajax로 불러와서 innerHtml 한경우만!!) 

 

ajax로 불러온 데이터들에 접근하려면 다른 방법을 사용해야한다.

 

--> 해결방법

<script>
$(document).on("click", ".project_list", function (e) {
	alert("hello@");
}
</script>

 

script 부문을 다음과 같이 바꿔보자

 

html을 쭉 작성하다보면, 페이지별로 공통적인 부분이 존재한다.

 

이를 따로 파일화 하는 것을 모듈화 라고 한다.

 

따로 파일로 빼서 , 공통부분은 그 파일을 참조해서 만들어라 라고 하는 것이다.

 

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-compatible" content="chrome=1,IE=edge">
    
    <script type="text/javascript" src="/../js/jquery-3.5.1.min.js"></script>
   
    <script>
        $(document).ready(function () {
            $("#header").load("/../html/menu.html", function () {
            //페이지 별로 다른 메뉴 css 적용도 가능
                document.getElementById("sub_nav").classList.add("show");
            });
        })
    </script>
    
</head>

<body>
    <div id='header'></div> // 이 부분에 import 한 menu가 들어가게 되는 것이다. 
    
    <article>
        <div class="contents"> 내용 </div>
    </article>
</body>
            

 

자주 사용하게 되어 따로 빼둔 html파일은 menu.html 이다.

html에 header라는 id로 div를 만들어 둔다. (menu.html)이 들어가게 될 구멍이라고 보면 된다.

 

$(document).ready(function() {

-> 페이지가 로딩 되면 실행하라 라는 함수이므로, 로딩과 동시에 menu.html을 심으세요@!!

 

라는 뜻이라고 생각하면 된다.

 

1. conda create --name 바꿀이름 --clone 기존이름

conda create --name py37_32 --clone python_env 

 

2. 복사된 가상환경 확인 

***키움 Open API 연동오류 해결 방법

AttributeError: 'QAxWidget' object has no attribute 'OnEventConnect'

 

오탈자도 없는데, 위와 같은 문제가 생겼다. 

찾아보니, bit가 안맞아서 발생하는 문제였다.

OPEN API는 32bit인데, 내가 사용하던 파이썬은 64bit이기 때문이다.

 

결론적으로는 파이썬 32bit 가상환경을 만들어서 파이참에서 사용하면 된다.

 

 

1. 아나콘다 프롬프트 실행 

(1. Anaconda Prompt) 

 

 

2. 파이썬 32비트로 설정

(2. setting 32bit python)

set CONDA_FORCE_32BIT=1

 

 

3. 파이썬 가상환경 설치

(3. install 32bit python virtual env)

가상환경이름은 주로 py37_32 와 같이 표현한다.

py : 파이썬

37 : 3.7 버전

32 : 32bit 

conda create -n py37_32 anaconda

 

 

4. 설치한 가상환경 실행

(4. activate the virtual env)

(base) 에서 (py37_32)로 변경된 것을 확인할 수 있다.

conda activate py37_32 

 

 

5. 설치된 가상환경 확인하기

(5. Check the folder of the virtual env)

Anaconda3 설치 폴더 밑에 가상환경들이 설치된 것을 볼 수 있다.

 


6. 설치한 가상환경을 Pycharm에 설정하기

(6. Setting the virtual env in Pycharm)

File - Settings 로 들어간다.

 

 

 

7. 설치한 가상환경 추가하기

(Add the virtual env)

Project - Python Interpreter - Add

 

 

 

 

8. 가상환경 열기

(8. Activate the virtual env in Pycharm)

Terminal - 

conda activate py37_32

크롤링이란?

웹페이지에 있는 정보를 내가 원하는 것만 뽑아서 수집하는 것이다.

 

주로 크롤링으로 많이 하는 것들은 이미지 파일들이다. 

이번에는 파이썬을 사용하여 이미지를 크롤링하고, 크롤링한 이미지 파일들을 opencv를 이용해서 원하는 포맷으로 편집까지 해보려한다.

 

크롤링에 많이 사용하는 것들은 뷰티풀숲(Beautiful Soup) 이다.

하지만 정적인 콘텐츠가 아니고, 동적인 콘텐츠의 경우 실제로 웹 창이 열려야 이미지 소스들이 그제서야(?) 웹페이지에 다운이 되는 경우가 많이 있다.

 

그래서 셀레니움(Selenium)을 사용한다.

 

1. 필요한 모듈을 설치한다.

!pip install bs4
!pip install selenium
!pip install opencv-python

 

2. 필요한 모듈을 import 한다

from bs4 import BeautifulSoup
from selenium import webdriver
import requests
import urllib.request
import time
import os
import urllib
from PIL import Image
import cv2

 

3. 자동차의 이미지를 크롤링 할 예정이므로 cars라는 딕셔너리에 '검색어':'저장할폴더이름' 형식으로 key값과 value값을 정한다.

link라는 빈 리스트를 만든다. 이 리스트는 나중에 img 소스의 링크를 저장할 리스트이다.

cars = {'셀토스':'seltos2'}
link = []

 

4. 먼저 셀레니움으로 웹드라이버를 불러온다. 

크롬 웹드라이버를 사용했는데, 크롬웹드라이버를 본인의 크롬 버전에 맞게 exe 파일을 다운받아서 exe 드라이버가 다운받아져 있는 디렉토리 경로를 입력하면 된다.

처음으로 띄울 웹페이지의 url을 입력한다.

for key in cars:
    driver = webdriver.Chrome('D:\chromedriver_win32\chromedriver.exe')
    driver.get('https://naver.com')
    

 

5.  네이버 창의 우클릭을 하여 "검사" 를 클릭한다.

 

 

6. '검사' 클릭시 나오는 우측 창 상단에 '화살표'모양을 누르고 검색창에 가져다 대면 해당 검색창 소스의 이름을 알 수 있다. name = 'query' 라고 적혀있다. 이 이름을 알아 내야 한다.

 

 

7. 알아낸 이름을 driver.find_element_by_name() 안에 작성한다.

이 함수는 말 그대로 요소의 이름으로 찾기 라는 것이다. 검색창이 소스상에서 이름이 query이므로 검색창에 .send_keys라는 매소드로 초기에 설정한 cars의 key 값인 '셀토스'를 입력한다.

 

입력 후 검색 버튼을 눌러야하는데, 이를 실행하는 방법은 다음과 같다.

검색버튼을 동일하게 화살표 모양으로 눌러서 html 소스를 찾는다.

해당 소스위에서 우클릭을 한 후 'copy' -> 'Copy XPath'를 한 후 driver.find_element_by_xpath() 안에 붙여넣기를 한다.

이는 해당 요소를 xpath로 찾는 다는 뜻이다. 이후 .click이라는 메소드를 하용하여 검색버튼을 클릭하는 행위까지 추가한다.

    driver.find_element_by_name('query').send_keys(key)
    driver.find_element_by_xpath('//*[@id="search_btn"]').click()
 

 

8. 여기서 조금 삽질? 까다로운 것이 나온다. 자동차 명에 따라서 어떤거는 상단에 바로 네이버 자동차 검색 페이지로 연결되는 것이 나오지만, 지금의 경우처럼 상단에 광고 링크나 파워링크가 먼저 떠서 네이버자동차검색 페이지 연결 링크가 아래로 내려가는 경우가 있다.

이는 어쩔 수 없지만 케이스에 따라 xpath를 바꿔주어야 한다.

대부분 맨 위의 상단의 div[2]값을 가져오는 듯 하지만, div[3] 값을 가져와야하는 경우도 있다.

    driver.find_element_by_xpath('//*[@id="main_pack"]/div[2]/div/div[2]/div/div[1]/dl/dt[1]/a').click()    
#     driver.find_element_by_xpath('//*[@id="main_pack"]/div[3]/div/div[2]/div/div[1]/dl/dt[1]/a').click()

 

 

9. 네이버 자동차 검색 링크를 클릭하면, 새로운 탭이 생성되므로 driver.swith_to.window로 탭을 변경해주어야 한다.

네이버 자동차 검색 링크에서 이미지 탭으로 이동한 후 time.sleep(1)로 1초 정도 이미지가 다운될 시간을 준다.(이는 생략 가능하지만, 생략할 경우 이미지가 다운 되기 전에 이미지 소스를 가져오려고 하여 도중에 에러가 나는 경우가 발생 할 수도 있다.)

img 라는 변수에 img 태그를 담고 get_attribute로 소스만 가져온다. 즉 해당 이미지가 가지고있는 인터넷 상에서 주소(url)만을 가져온다. 

그 url을 초기에 만들어둔 빈 리스트인 link에 담는다.

    driver.switch_to.window(driver.window_handles[1])
    driver.find_element_by_xpath('//*[@id="content"]/div[1]/ul/li[3]/a').click()
    time.sleep(1)
    img = driver.find_element_by_xpath('//*[@id="container"]/div[5]/div/div/ul/li[2]/img')
    img.get_attribute('src')
    link.append(img.get_attribute('src'))

 

10. 최초 이미지는 위의 코드에서 저장을 했고, 그 이후에 더 많은 이미지를 진행하고 싶다면 for문으로 한장씩 옆으로 넘기면서 img 소스를 link라는 리스트에 저장을 하면 된다.

	for i in range(19):
        driver.find_element_by_xpath('//*[@id="container"]/div[5]/div/a[2]/div').click()
        time.sleep(1)
        img = driver.find_element_by_xpath('//*[@id="container"]/div[5]/div/div/ul/li[2]/img')
        img.get_attribute('src')
        link.append(img.get_attribute('src'))

 

11.  드라이버를 닫고, os 모듈을 통해 폴더를 생성한다. 초기에 지정한 cars[key] 의 value값으로 폴더를 만든다.

count 값은 폴더 안에서 이름을 지정할 때 중복이 되지 않게 하기위해 count를 하나씩 증하했다.

area = (0,0,980,570) 으로 지정하여 image를 원하는 크기로 자른 후 저장한다.

 	driver.close()
    count = 0
    os.makedirs(os.path.join('D:/blog/'+cars[key]))
    
    for url in link:
        count += 1
        urllib.request.urlretrieve(url, 'D:/blog/'+cars[key]+'/asigd'+str(count)+'iwjed.jpg')
        image = Image.open('D:/blog/'+cars[key]+'/asigd'+str(count)+'iwjed.jpg')
        area = (0,0,980,570)
        crop_image = image.crop(area)
        crop_image.save('D:/blog/'+cars[key]+'/asigd'+str(count)+'iwjed.jpg')

 

12.  저장한 이미지를 2개씩 붙이고 border(테두리)를 만들어주는 코드이다.

    for i in range(1,22, 2):
        img1 = cv2.imread('D:/blog/'+cars[key]+'/asigd'+str(i)+'iwjed.jpg')
        img2 = cv2.imread('D:/blog/'+cars[key]+'/asigd'+str(1+i)+'iwjed.jpg')
        addv = cv2.vconcat([img1, img2])
        bordersize = 2
        border = cv2.copyMakeBorder(addv, top=bordersize, bottom=bordersize, left=bordersize, right=bordersize, borderType=cv2.BORDER_CONSTANT, value=[0,0,0])
        cv2.imwrite('D:/blog/'+cars[key]+'/asigd'+str(i*123)+'iwjed.jpg', border)
    
    

 

 

전체 코드 참조

cars = {'셀토스':'seltos2'}
link = []

for key in cars:
    driver = webdriver.Chrome('D:\chromedriver_win32\chromedriver.exe')
    driver.get('https://naver.com')
    
    driver.find_element_by_name('query').send_keys(key)
    driver.find_element_by_xpath('//*[@id="search_btn"]').click()
    
    driver.find_element_by_xpath('//*[@id="main_pack"]/div[2]/div/div[2]/div/div[1]/dl/dt[1]/a').click()    
#     driver.find_element_by_xpath('//*[@id="main_pack"]/div[3]/div/div[2]/div/div[1]/dl/dt[1]/a').click()
#     driver.find_element_by_xpath('//*[@id="main_pack"]/div[2]/div/div[2]/div/div[1]/dl/dt[1]/a').click()
    
    
    driver.switch_to.window(driver.window_handles[1])
    driver.find_element_by_xpath('//*[@id="content"]/div[1]/ul/li[3]/a').click()
    time.sleep(1)
    img = driver.find_element_by_xpath('//*[@id="container"]/div[5]/div/div/ul/li[2]/img')
    img.get_attribute('src')
    link.append(img.get_attribute('src'))
    
    for i in range(19):
        driver.find_element_by_xpath('//*[@id="container"]/div[5]/div/a[2]/div').click()
        time.sleep(1)
        img = driver.find_element_by_xpath('//*[@id="container"]/div[5]/div/div/ul/li[2]/img')
        img.get_attribute('src')
        link.append(img.get_attribute('src'))
#         driver.find_element_by_xpath('//*[@id="container"]/div[5]/div/a[2]/div').click()
    
    driver.close()
    count = 0
    os.makedirs(os.path.join('D:/blog/'+cars[key]))
    
    for url in link:
        count += 1
        urllib.request.urlretrieve(url, 'D:/blog/'+cars[key]+'/asigd'+str(count)+'iwjed.jpg')
        image = Image.open('D:/blog/'+cars[key]+'/asigd'+str(count)+'iwjed.jpg')
        area = (0,0,980,570)
        crop_image = image.crop(area)
        crop_image.save('D:/blog/'+cars[key]+'/asigd'+str(count)+'iwjed.jpg')
    
    for i in range(1,22, 2):
        img1 = cv2.imread('D:/blog/'+cars[key]+'/asigd'+str(i)+'iwjed.jpg')
        img2 = cv2.imread('D:/blog/'+cars[key]+'/asigd'+str(1+i)+'iwjed.jpg')
        addv = cv2.vconcat([img1, img2])
        bordersize = 2
        border = cv2.copyMakeBorder(addv, top=bordersize, bottom=bordersize, left=bordersize, right=bordersize, borderType=cv2.BORDER_CONSTANT, value=[0,0,0])
        cv2.imwrite('D:/blog/'+cars[key]+'/asigd'+str(i*123)+'iwjed.jpg', border)
    
    

 

 

전체 코드 github에서 다운받기

github.com/eugenekk/crawling_naver_img.git

인덱싱은 필요한 칼럼이나 로우를 인덱스로 가져오는 것이다.

 

슬라이싱은 필요한 부분만 남기고 잘라내는 것이다.

 

1) .loc : 명시된 인덱스 참조

import numpy as np
import pandas as pd

family_df = pd.DataFrame({"Gender":gender_series, "Age":age_series, "Job":job_series})
        Gender   Age         Job
Flin      Male   NaN     Student
Hank      Male  30.0         DEA
Mary    Female  25.0      Doctor
Skyler  Female  38.0  Accountant 

# "Hank"라고 명시적으로 인덱스 표기하여 데이터 추출하기
print(family_df.loc["Hank"])

# 결과
Gender    Male
Age         30
Job        DEA
Name: Hank, dtype: object

# 명시적인 인덱스의 범위를 지정하기 & 명시적인 칼럼의 범위 지정하기 
# 필요한 데이터만 추출하기
print(family_df.loc["Hank":"Skyler", :"Age"])

# 결과
        Gender   Age
Hank      Male  30.0
Mary    Female  25.0
Skyler  Female  38.0

 

2) .iloc : 정수 인덱스 참조

import numpy as np
import pandas as pd

family_df = pd.DataFrame({"Gender":gender_series, "Age":age_series, "Job":job_series})
        Gender   Age         Job
Flin      Male   NaN     Student
Hank      Male  30.0         DEA
Mary    Female  25.0      Doctor
Skyler  Female  38.0  Accountant 

# 일반적인 정수 인덱스를 사용하여 데이터 추출하기
print(family_df.iloc[0])

# 결과
Gender       Male
Age           NaN
Job       Student
Name: Flin, dtype: object

# 일반적인 정수 인덱스의 범위를 지정하기 & 칼럼번호도 정수로 범위 지정하기
# 필요한 데이터만 추출하기 

print(family_df.iloc[1:3, 0:2])
# 결과
      Gender   Age
Hank    Male  30.0
Mary  Female  25.0

 

3) .head(N) : 위에서부터 N개 남기고 잘라내기

import numpy as np
import pandas as pd

family_df 
        Gender   Age         Job  Tall  Weight  Number
Flin      Male   NaN     Student   178    70.0     0.0
Hank      Male  30.0         DEA   183     NaN  5490.0
Mary    Female  25.0      Doctor   165     NaN  4125.0
Skyler  Female  38.0  Accountant   170     NaN  6460.0
Walt      Male  50.0     Teacher   180     NaN  9000.0
Zessi     Male  23.0      Dealer   170     NaN  3910.0

# 위에서부터 3개만 잘라내기

print(family_df.head(3))
      Gender   Age      Job  Tall  Weight  Number
Flin    Male   NaN  Student   178    70.0     0.0
Hank    Male  30.0      DEA   183     NaN  5490.0
Mary  Female  25.0   Doctor   165     NaN  4125.0

+ Recent posts