In [ ]:
import pandas as pd
In [ ]:
# 부재료 - 시트1.csv 파일을 판다스로 읽어옵니다
df2 = pd.read_csv('부재료가공완료.csv', encoding='utf-8')
# df2 index를 1부터 시작하게 바꿔줍니다
df2.index = range(1, len(df2) + 1)
df2
Out[ ]:
재료 | 사진 | Unnamed: 2 | |
---|---|---|---|
1 | 소주잔 | NaN | https://www.google.com/imgres?imgurl=https%3A%... |
2 | 맥주잔 | NaN | https://www.google.com/imgres?imgurl=https%3A%... |
3 | 얼음 | NaN | https://www.google.com/imgres?imgurl=http%3A%2... |
4 | 토닉워터 | NaN | https://www.google.com/imgres?imgurl=https%3A%... |
5 | 소주 | NaN | https://www.google.com/imgres?imgurl=http%3A%2... |
... | ... | ... | ... |
82 | 오렌지쌕쌕 | NaN | https://i.imgur.com/1ZQ3Z9M.png |
83 | 복숭아봉봉 | NaN | https://i.imgur.com/1ZQ3Z9M.png |
84 | 요거풋풋 | NaN | https://i.imgur.com/1ZQ3Z9M.png |
85 | 기네스 | NaN | https://i.imgur.com/1ZQ3Z9M.png |
86 | 숙취음료 | NaN | https://i.imgur.com/1ZQ3Z9M.png |
86 rows × 3 columns
In [ ]:
df2 = df2["재료"]
# df2를 데이터프레임으로 바꿔줍니다
df2 = pd.DataFrame(df2)
df2
# df2를 리스트로 바꿔줍니다
df2_list = df2.values.tolist()
In [ ]:
df2_list
# df2_list를 일반 리스트로 바꿔줍니다
df2_list = [i[0] for i in df2_list]
In [ ]:
df2_list
Out[ ]:
['소주잔', '맥주잔', '얼음', '토닉워터', '소주', '맥주', '흑맥주', '콜라', '사이다', '환타', '탄산수', '위스키', '레몬', '우유', '원두커피', '홍차', '봉봉', '밀키스', '블루레몬에이드', '이온음료', '망고주스', '홍초', '라임', '수박에이드', '메로나', '모구모구', '핫식스', '폴라포', '초코에몽', '미숫가루', '스크류바', '토마토주스', '오렌지주스', '피치트리', '매화수', '설레임', '아이스티', '요구르트', '깔루아', '오렌지', '데킬라', '체리', '소금', '젤리', '파인애플 통조림', '시럽', '예거', '꿀', '생수', '하이볼', '복분자', '우롱차', '레몬즙', '리큐어', '진저에일', '코코넛', '크림', '청포도', '막걸리', '맛밤', '쿨피스', '라거', '자몽', '깔라만시', '스파클링', '딸기우유', '아침햇살', '코코팜', '코코넛워터', '포도주스', '사과주스', '데미소다', '보리차', '비타500', '포도봉봉', '망고링고', '탄산', '레몬맛 탄산음료', '빨간과일식초', '파워에이드', '블루베리에이드', '오렌지쌕쌕', '복숭아봉봉', '요거풋풋', '기네스', '숙취음료']
재료를 가져왔으니 칵테일 목록도 가져옵니다
In [ ]:
import pandas as pd
# 칵테일목록가공완료.csv파일을 판다스로 읽어옵니다
df = pd.read_csv('칵테일목록가공완료.csv', encoding='utf-8')
df.head()
# df의 index를 2부터 시작하게 바꿔줍니다
df.index = range(2, len(df) + 2)
df.head()
Out[ ]:
title | ingredient1 | ingredient2 | ingredient3 | ingre_ratio1 | ingre_ratio2 | ingre_ratio3 | 비율 | 레시피임시 | 레시피 | |
---|---|---|---|---|---|---|---|---|---|---|
2 | 블루레몬에이드밀키스주 | 소주 | 밀키스 | 블루레몬에이드 | 4 | 3.0 | 3.0 | 4:3:3 | 소주, 밀키스, 블루레몬에이드 | 소주, 밀키스, 블루레몬에이드를 4:3:3 비율로 섞어서 만들어요 |
3 | 탄산봉봉주 | 소주 | 포도봉봉 | 탄산수 | 4 | 3.0 | 3.0 | 4:3:3 | 소주, 포도봉봉, 탄산수 | 소주, 포도봉봉, 탄산수를 4:3:3 비율로 섞어서 만들어요 |
4 | 소망주 | 소주 | 망고링고 | NaN | 3 | 7.0 | NaN | 3:7 | 소주, 망고링고 | 소주, 망고링고를 3:7 비율로 섞어서 만들어요 |
5 | 탄산이온주 | 소주 | 탄산 | 이온음료 | 4 | 2.0 | 4.0 | 4:2:4 | 소주, 탄산, 이온음료 | 소주, 탄산, 이온음료를 4:2:4 비율로 섞어서 만들어요 |
6 | 레몬주 | 소주 | 레몬맛 탄산음료 | NaN | 4 | 6.0 | NaN | 4:6 | 소주, 레몬맛 탄산음료 | 소주, 레몬맛 탄산음료를 4:6 비율로 섞어서 만들어요 |
In [ ]:
df["ingredient3"]
df1_list = df["ingredient3"].values.tolist()
df1_list
Out[ ]:
['블루레몬에이드', '탄산수', nan, '이온음료', nan, nan, '파란이온음료', nan, '밀키스', '핫식스', nan, '사이다', '사이다', nan, nan, '사이다', nan, '사이다', '콜라', '사이다', nan, nan, '토마토주스', nan, nan, nan, nan, nan, '봉봉', nan, nan, nan, nan, '사이다', nan, nan, nan, '레몬', nan, nan, '사이다', '복분자', '탱크보이', '이온음료']
In [ ]:
# nan값은 문자열도 아니고 null도 아니고 float이다 (특이점)
df1_list[2] == "nan"
Out[ ]:
False
In [ ]:
# 없는 재료를 저장할 리스트를 만듭니다
isNot = []
# 있는 재료를 저장할 리스트를 만듭니다
df_df2_list = []
# df1_list와 df2_list의 값을 숫자를 매겨주면서 비교합니다
for i in range(len(df1_list)):
if type(df1_list[i]) == float: # df1_list[i]가 nan값이면
print("nan값이 있습니다")
continue # 다음 반복문으로 넘어갑니다
# continue를 만나면 아래 코드는 실행되지 않습니다
print("--------", i, "번째 반복문 시작-----------")
print(df1_list[i]+" 있을까요?")
for j in range(len(df2_list)):
if df1_list[i] == df2_list[j]:
print(str(i)+"번째 " +df1_list[i] +" 는 "+str(j)+"번째 "+df2_list[j]+" 안에 있습니다")
df_df2_list.append(str(i)+","+str(j) + "," + df1_list[i] + "," + df2_list[j])
if df1_list[i] not in df2_list:
print("없습니다")
isNot.append(df1_list[i])
-------- 0 번째 반복문 시작----------- 블루레몬에이드 있을까요? 0번째 블루레몬에이드 는 18번째 블루레몬에이드 안에 있습니다 -------- 1 번째 반복문 시작----------- 탄산수 있을까요? 1번째 탄산수 는 10번째 탄산수 안에 있습니다 nan값이 있습니다 -------- 3 번째 반복문 시작----------- 이온음료 있을까요? 3번째 이온음료 는 19번째 이온음료 안에 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 6 번째 반복문 시작----------- 파란이온음료 있을까요? 없습니다 nan값이 있습니다 -------- 8 번째 반복문 시작----------- 밀키스 있을까요? 8번째 밀키스 는 17번째 밀키스 안에 있습니다 -------- 9 번째 반복문 시작----------- 핫식스 있을까요? 9번째 핫식스 는 26번째 핫식스 안에 있습니다 nan값이 있습니다 -------- 11 번째 반복문 시작----------- 사이다 있을까요? 11번째 사이다 는 8번째 사이다 안에 있습니다 -------- 12 번째 반복문 시작----------- 사이다 있을까요? 12번째 사이다 는 8번째 사이다 안에 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 15 번째 반복문 시작----------- 사이다 있을까요? 15번째 사이다 는 8번째 사이다 안에 있습니다 nan값이 있습니다 -------- 17 번째 반복문 시작----------- 사이다 있을까요? 17번째 사이다 는 8번째 사이다 안에 있습니다 -------- 18 번째 반복문 시작----------- 콜라 있을까요? 18번째 콜라 는 7번째 콜라 안에 있습니다 -------- 19 번째 반복문 시작----------- 사이다 있을까요? 19번째 사이다 는 8번째 사이다 안에 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 22 번째 반복문 시작----------- 토마토주스 있을까요? 22번째 토마토주스 는 31번째 토마토주스 안에 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 28 번째 반복문 시작----------- 봉봉 있을까요? 28번째 봉봉 는 16번째 봉봉 안에 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 33 번째 반복문 시작----------- 사이다 있을까요? 33번째 사이다 는 8번째 사이다 안에 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 37 번째 반복문 시작----------- 레몬 있을까요? 37번째 레몬 는 12번째 레몬 안에 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 40 번째 반복문 시작----------- 사이다 있을까요? 40번째 사이다 는 8번째 사이다 안에 있습니다 -------- 41 번째 반복문 시작----------- 복분자 있을까요? 41번째 복분자 는 50번째 복분자 안에 있습니다 -------- 42 번째 반복문 시작----------- 탱크보이 있을까요? 없습니다 -------- 43 번째 반복문 시작----------- 이온음료 있을까요? 43번째 이온음료 는 19번째 이온음료 안에 있습니다
In [ ]:
isNot
Out[ ]:
['파란이온음료', '탱크보이']
두개의 빈값이 있는것을 확인했고
해당 두개의 빈값을 크롤링해서 가져옵니다
위에 코드에 드라이버만 추가합니다
In [ ]:
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd
import numpy as np
import csv
import os
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.alert import Alert # 경고창
from selenium.webdriver.chrome.options import Options # 크롬 드라이버 자동 설치
from selenium.webdriver.chrome.service import Service # 크롬 드라이버 자동 설치
from webdriver_manager.chrome import ChromeDriverManager # 크롬 드라이버 자동 설치
import base64 # 이미지 인코딩
In [ ]:
# 구글 드라이버를 사용하기 위한 설정
options = webdriver.ChromeOptions() # 크롬 옵션 객체 생성
# options.add_argument("headless") # 창 숨기기
options.add_argument('window-size=1920x1080') # 창 크기 설정
options.add_argument("disable-gpu") # GPU 사용 안함
options.add_argument("lang=ko_KR") # 언어 설정
In [ ]:
# 없는 재료를 저장할 리스트를 만듭니다
isNot = []
# 있는 재료를 저장할 리스트를 만듭니다
df_df2_list = []
# 크롬 드라이버 객체 생성
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
# 이미지의 url을 저장할 리스트를 만듭니다
imgUrl = []
# df1_list와 df2_list의 값을 숫자를 매겨주면서 비교합니다
for i in range(len(df1_list)):
if type(df1_list[i]) == float: # df1_list[i]가 nan값이면
print("nan값이 있습니다")
continue # 다음 반복문으로 넘어갑니다
# continue를 만나면 아래 코드는 실행되지 않습니다
print("--------", i, "번째 반복문 시작-----------")
print(df1_list[i]+" 있을까요?")
for j in range(len(df2_list)):
if df1_list[i] == df2_list[j]:
print(str(i)+"번째 " +df1_list[i] +" 는 "+str(j)+"번째 "+df2_list[j]+" 안에 있습니다")
df_df2_list.append(str(i)+","+str(j) + "," + df1_list[i] + "," + df2_list[j])
if df1_list[i] not in df2_list:
print("없습니다")
isNot.append(df1_list[i])
# 구글 검색창에 내가입력한 keyword 검색한다.
driver.get('https://www.google.com/')
driver.find_element(By.NAME, 'q').send_keys(df1_list[i])
driver.find_element(By.NAME, 'q').send_keys(Keys.ENTER)
# 사진 검색
driver.find_element(By.LINK_TEXT, '이미지').click() # link_text는 링크 텍스트를 찾는다.
# # 1번째 이미지 클릭
# driver.find_element(By.CSS_SELECTOR, 'img.rg_i.Q4LuWd').click() # css_selector는 css 선택자를 찾는다.
# 1번째 이미지의 링크 주소를 가져온다.
img = driver.find_element(By.CSS_SELECTOR, 'img.rg_i.Q4LuWd')
img_src = img.get_attribute('src')
# 이미지의 링크 주소를 리스트에 저장한다.
imgUrl.append(df1_list[i]+","+ img_src)
-------- 0 번째 반복문 시작----------- 블루레몬에이드 있을까요? 0번째 블루레몬에이드 는 18번째 블루레몬에이드 안에 있습니다 -------- 1 번째 반복문 시작----------- 탄산수 있을까요? 1번째 탄산수 는 10번째 탄산수 안에 있습니다 nan값이 있습니다 -------- 3 번째 반복문 시작----------- 이온음료 있을까요? 3번째 이온음료 는 19번째 이온음료 안에 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 6 번째 반복문 시작----------- 파란이온음료 있을까요? 없습니다 nan값이 있습니다 -------- 8 번째 반복문 시작----------- 밀키스 있을까요? 8번째 밀키스 는 17번째 밀키스 안에 있습니다 -------- 9 번째 반복문 시작----------- 핫식스 있을까요? 9번째 핫식스 는 26번째 핫식스 안에 있습니다 nan값이 있습니다 -------- 11 번째 반복문 시작----------- 사이다 있을까요? 11번째 사이다 는 8번째 사이다 안에 있습니다 -------- 12 번째 반복문 시작----------- 사이다 있을까요? 12번째 사이다 는 8번째 사이다 안에 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 15 번째 반복문 시작----------- 사이다 있을까요? 15번째 사이다 는 8번째 사이다 안에 있습니다 nan값이 있습니다 -------- 17 번째 반복문 시작----------- 사이다 있을까요? 17번째 사이다 는 8번째 사이다 안에 있습니다 -------- 18 번째 반복문 시작----------- 콜라 있을까요? 18번째 콜라 는 7번째 콜라 안에 있습니다 -------- 19 번째 반복문 시작----------- 사이다 있을까요? 19번째 사이다 는 8번째 사이다 안에 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 22 번째 반복문 시작----------- 토마토주스 있을까요? 22번째 토마토주스 는 31번째 토마토주스 안에 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 28 번째 반복문 시작----------- 봉봉 있을까요? 28번째 봉봉 는 16번째 봉봉 안에 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 33 번째 반복문 시작----------- 사이다 있을까요? 33번째 사이다 는 8번째 사이다 안에 있습니다 nan값이 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 37 번째 반복문 시작----------- 레몬 있을까요? 37번째 레몬 는 12번째 레몬 안에 있습니다 nan값이 있습니다 nan값이 있습니다 -------- 40 번째 반복문 시작----------- 사이다 있을까요? 40번째 사이다 는 8번째 사이다 안에 있습니다 -------- 41 번째 반복문 시작----------- 복분자 있을까요? 41번째 복분자 는 50번째 복분자 안에 있습니다 -------- 42 번째 반복문 시작----------- 탱크보이 있을까요? 없습니다 -------- 43 번째 반복문 시작----------- 이온음료 있을까요? 43번째 이온음료 는 19번째 이온음료 안에 있습니다
In [ ]:
imgUrl
Out[ ]:
['파란이온음료,data:image/jpeg;base64,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', '탱크보이,data:image/jpeg;base64,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']
In [ ]:
# 가져온 이미지의 링크 주소를 csv 파일에 저장한다.
with open('imgUrl.csv', 'w', encoding='utf-8') as f:
for i in imgUrl:
f.write(i + '\n')
base64이미지를 디코딩해서 저장합니다¶
In [ ]:
import base64
for i in range(len(imgUrl)):
img_data = base64.b64decode(imgUrl[i].split(',')[2]) # split(',')[1]은 base64로 인코딩된 이미지만 가져온다.
keyword = imgUrl[i].split(',')[0]
# myimages폴더가 없으면 생성한다.
if not os.path.exists('myimages'): # os.path.exists는 폴더가 있는지 확인한다.
os.makedirs('myimages') # os.makedirs는 폴더를 생성한다.
# 디코딩된 이미지를 저장한다.
with open(f'myimages/{keyword}.png', 'wb') as f: # wb는 write binary
f.write(img_data)
없는데이터도 가져왔으니 다시 한번 비교해보겠습니다
In [ ]:
# 부재료 - 시트2.csv를 불러와서 데이터 프레임으로 만든다.
df0 = pd.read_csv('부재료가공완료.csv', encoding='utf-8')
df0.loc[ :,["재료","Unnamed: 2"]]
#86 번째 행부터 마지막 행까지만 가져온다.
df0 = df0.loc[86: ,["재료","Unnamed: 2"]]
In [ ]:
df0
Out[ ]:
재료 | Unnamed: 2 | |
---|---|---|
86 | 파란이온음료 | https://i.imgur.com/1ZQ3Z9M.png |
87 | 탱크보이 | https://i.imgur.com/1ZQ3Z9M.png |
In [ ]:
df0= df0.values.tolist()
In [ ]:
df0
Out[ ]:
[['파란이온음료', 'https://i.imgur.com/1ZQ3Z9M.png'], ['탱크보이', 'https://i.imgur.com/1ZQ3Z9M.png']]
In [ ]:
# # df를 mysql에 넣기 위해 리스트로 바꿔줍니다
# df = df.values.tolist()
# df
# mysql에 연결합니다
import pymysql
from Config import Config
# MySQL Connection 연결
conn = pymysql.connect(host=Config.host , user=Config.user, password=Config.password, db=Config.db, charset='utf8')
# Connection 으로부터 Cursor 생성
curs = conn.cursor()
# SQL문 실행 name, imgUrl
sql = "insert into ingredient(name, imgUrl) values(%s, %s)"
curs.executemany(sql, df0)
# 저장을 반영합니다
conn.commit()
# Connection 닫기
conn.close()
curs.close()
잘저장되었는지 확인합니다
In [ ]:
# mysql에 연결합니다
conn = pymysql.connect(host=Config.host , user=Config.user, password=Config.password, db=Config.db, charset='utf8')
# Connection 으로부터 Cursor 생성
curs = conn.cursor()
#마지막 두개의 행만 가져오는 sql문
sql = "select * from ingredient order by id desc limit 2"
curs.execute(sql)
rows = curs.fetchall()
for row in rows:
print(row)
conn.commit()
conn.close()
(88, '탱크보이', 'https://i.imgur.com/1ZQ3Z9M.png', datetime.datetime(2023, 3, 6, 22, 7, 48), datetime.datetime(2023, 3, 6, 22, 7, 48)) (87, '파란이온음료', 'https://i.imgur.com/1ZQ3Z9M.png', datetime.datetime(2023, 3, 6, 22, 7, 48), datetime.datetime(2023, 3, 6, 22, 7, 48))
html 코드를 예쁘게 보기 위해 사용합니다
In [ ]:
from IPython.display import display, HTML
display(HTML("<style>.container { width:90% !important; }</style>"))
'DataScience > Crawling' 카테고리의 다른 글
Crawling 구글자동검색이미지다운 (0) | 2023.03.06 |
---|---|
Selenium 구글웹드라이버 사용 기본 (0) | 2023.02.24 |