$(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);
}
<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을 심으세요@!!
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이라는 메소드를 하용하여 검색버튼을 클릭하는 행위까지 추가한다.
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)
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