maria DB 엑세스가 거부되었습니다.
엑세스가 거부되었습니다 -> 명령프롬프트 우클릭 관리자 권한으로 실행
drop database hollys;
javascript 기반으로 되어 있어서 beautifulsoup으로 구할 수 없다. -> selenium 사용
구글 정보 확인 -
버전 108.0.5359.125(공식 빌드) (64비트)
selenium 다운 - https://chromedriver.chromium.org/downloads
다운받은 .exe 파일 .ipynb있는 폴더에 넣기
파일명 chromedriver108.exe 변경했음
나중에 chrome업데이트를 대비하여 크롬버전으로 파일명을 바꿈
selenium 설치
!pip install selenium
selenium 이용하여 커피빈 사이트로 이동
주소확인
from selenium import webdriver
wd = webdriver.Chrome("chromedriver108.exe")
wd.get("https://www.coffeebeankorea.com/store/store.asp") #주소로 이동
wd.execute_script("storePop2('31')")
이동
selenium 사용 시 주의점은 데이터가 다 넘어오지 않았는데 작업을 수행하면 작동되지 않으니 time.sleep()을 적절히 사용해야 한다.
selenium은 javascript 관련된 것을 사용하고 나머지는 beautifulSoup사용
from bs4 import BeautifulSoup
import urllib.request
page_num = 2
url = f"https://www.hollys.co.kr/store/korea/korStore2.do?pageNo={page_num}&sido=&gugun=&store="
html = urllib.request.urlopen(url) #url열어주세요
soup = BeautifulSoup(html, 'html.parser')
tbody = soup.find("tbody")
trs = tbody.find_all("tr")
for tr in trs:
tds = tr.find_all("td")
print(tds[0].text, tds[1].text, tds[3].text, tds[5].text, sep='\t')
부산 북구 부산화명점 부산광역시 북구 금곡대로285번길 13 (화명동, 스포렉스) 스포렉스 106호,107호,108호 070-8884-1101
서울 서초구 방배역점 서울특별시 서초구 방배로 107 (방배동, 디엠타워3관) 1층 02-523-4180
경기 고양시 덕양구 고양향동점 경기도 고양시 덕양구 향기3로 9, 101호 (향동동) 향동동 536 02-3158-0031
광주 북구 광주북구청점 광주광역시 북구 서방로 2 (중흥동) . 062-511-8002
전북 전주시 완산구 전주한옥마을점 전라북도 전주시 완산구 은행로 16 (풍남동 1가 53-3) . 063-288-0801
강원 홍천군 (상)홍천휴게소R점 강원도 홍천군 화촌면 서울양양고속도로 83 . 010-4668-2505
부산 부산진구 부산시민공원점 부산 부산진구 시민공원로 73, 푸드코트피크닉 범전동 200 .
충남 홍성군 충남도청점 충청남도 홍성군 홍북읍 신경리 553 . 041-631-4725
경기 성남시 성남모란역점 경기도 성남시 중원구 성남대로1148번길 8 1층, 성남동 3453 031-758-5953
서울 강남구 강남역2점 서울특별시 강남구 강남대로 422 (역삼동) 역삼동816,816-7,816-8 02-568-9056
from bs4 import BeautifulSoup
import urllib.request
for page_num in range(1, 53+1):
url = f"https://www.hollys.co.kr/store/korea/korStore2.do?pageNo={page_num}&sido=&gugun=&store="
# print(url)
html = urllib.request.urlopen(url) #url열어주세요
soup = BeautifulSoup(html, 'html.parser')
tbody = soup.find("tbody")
trs = tbody.find_all("tr")
for tr in trs:
tds = tr.find_all("td")
print(tds[0].text, tds[1].text, tds[3].text, tds[5].text, sep='\t')
서울 강남구 강남우리라운지점 서울특별시 강남구 테헤란로 301 역삼동 701-02 삼정빌딩 1층 02-566-1002
경기 수원시 수원영통점 경기도 수원시 영통구 청명남로 10 영통동 1000-1 031-202-3356 생략
df_hollys = pd.DataFrame(columns=['지역명','매장명','주소','전화번호'],
index=[1,2,3,4,])
df_hollys
지역명 | 매장명 | 주소 | 전화번호 |
---|
df_oneline = pd.DataFrame({"지역":"A", "매장명":"B", "주소":"C","전화번호":"D"}, index=[0])
df_oneline
지역 | 매장명 | 주소 | 전화번호 | |
---|---|---|---|---|
0 | A | B | C | D |
from bs4 import BeautifulSoup
import pandas as pd
import urllib.request
import warnings
warnings.filer
df_hollys = pd.DataFrame(columns=['지역','매장명','주소','전화번호'])
i = 0
for page_num in range(1, 53+1):
url = f"https://www.hollys.co.kr/store/korea/korStore2.do?pageNo={page_num}&sido=&gugun=&store="
# print(url)
html = urllib.request.urlopen(url) #url열어주세요
soup = BeautifulSoup(html, 'html.parser')
tbody = soup.find("tbody")
trs = tbody.find_all("tr")
for tr in trs:
tds = tr.find_all("td")
#print(tds[0].text, tds[1].text, tds[3].text, tds[5].text, sep='\t')
line = pd.DataFrame({"지역":tds[0].text, "매장명":tds[1].text,
"주소":tds[3].text,"전화번호":tds[5].text},
index=[i])
i+=1
df_hollys = df_hollys.append(line)
C:\Users\user\AppData\Local\Temp\ipykernel_3544\3329726377.py:24: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
df_hollys = df_hollys.append(line) 생략
df_hollys
지역 | 매장명 | 주소 | 전화번호 | |
---|---|---|---|---|
0 | 서울 강남구 | 강남우리라운지점 | 서울특별시 강남구 테헤란로 301 역삼동 701-02 삼정빌딩 1층 | 02-566-1002 |
1 | 경기 수원시 | 수원영통점 | 경기도 수원시 영통구 청명남로 10 영통동 1000-1 | 031-202-3356 |
2 | 경기 고양시 덕양구 | 원흥역점 | 경기 고양시 덕양구 권율대로 690 201동 108호~111호 | 031.967.0302 |
3 | 서울 용산구 | 이태원역점 | 서울특별시 용산구 이태원로 180 2층~3층 | 02-749-8752 |
4 | 서울 양천구 | 오목교역점 | 서울특별시 양천구 오목로 344 (목동, 청학빌딩) 1층 | 02-2062-8405 |
... | ... | ... | ... | ... |
516 | 경기 성남시 수정구 | 신흥역점 | 경기도 성남시 수정구 산성대로 265 (신흥동) 2층 할리스 | 031-626-6140 |
517 | 서울 관악구 | 신림점 | 서울특별시 관악구 신림로 353-1 | 02-877-0019 |
518 | 서울 중구 | 태평로점 | 서울특별시 중구 세종대로 64, 해남빌딩 1층 (태평로2가 70-5) 할리스 | 02-755-7795 |
519 | 부산 부산진구 | 부산서면본점 | 부산광역시 부산진구 동천로 73, DS타워 1~2층 (부전동 부전동 169-1) 할리스 | 051-819-9117 |
520 | 서울 서대문구 | 신촌점 | 서울특별시 서대문구 연세로 34 (창천동 31-12) 할리스 | 02-393-2004 |
521 rows × 4 columns
df_hollys.to_csv("hollys_매장정보_20230111.csv", encoding="cp949")
df_hollys.to_excel("hollys_매장정보_20230111.xlsx", encoding="cp949")
!pip install openyxl
"""
MYSQL 작성법
create database hollys;
use hollys;
create table hollys0111(
id integer primary key,
local varchar(20),
storename varchar(20),
address varchar(100),
phone varchar(20)
);
desc hollys0111;
insert into hollys0111 values (0, '서울 강남구', '강남우리라운지점',
'서울특별시 강남구 테헤란로 301 역삼동 701-02 삼정빌딩 1층', '02-566-1002');
"""
!pip install pymysql
Collecting pymysql
Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
---------------------------------------- 43.8/43.8 kB 2.1 MB/s eta 0:00:00
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2
import pymysql as m
#connect , execute, close 한 셀에 넣는 것 추천
con = m.connect(host="localhost", user="root",
db = "hollys",
password="1234", charset="utf8")
cur = con.cursor() #커서 구하고
#실행할 sql 정의
sql = """insert into hollys0111 values (0, '서울 강남구', '강남우리라운지점',
'서울특별시 강남구 테헤란로 301 역삼동 701-02 삼정빌딩 1층', '02-566-1002');"""
cur.execute(sql) #보내기
con.commit()#변화 업데이트
con.close()
#connect , execute, close 한 셀에 넣는 것 추천
con = m.connect(host="localhost", user="root",
db = "hollys",
password="1234", charset="utf8")
cur = con.cursor() #커서 구하고
q_id = 1
q_local = '서울 강남구'
q_storename = '강남우리라운지점'
q_address = '서울특별시 강남구 테헤란로 301 역삼동 701-02 삼정빌딩 1층'
q_phone = '02-566-1002'
sql = """insert into hollys0111 values (%s,%s,%s,%s, %s); """ #기본틀
cur.execute(sql, (q_id, q_local, q_storename, q_address, q_phone)) # 기본틀안에 들어가는 컨텐츠
con.commit()#변화 업데이트
con.close()
con = m.connect(host="localhost", user="root",
db = "hollys",
password="1234", charset="utf8")
cur = con.cursor()
sql = "select * from hollys0111;"
cur.execute(sql)
res = cur.fetchall()
for data in res:
print(data)
con.close()
(0, '서울 강남구', '강남우리라운지점', '서울특별시 강남구 테헤란로 301 역삼동 701-02 삼정빌딩 1층', '02-566-1002')
(1, '서울 강남구', '강남우리라운지점', '서울특별시 강남구 테헤란로 301 역삼동 701-02 삼정빌딩 1층', '02-566-1002')
from bs4 import BeautifulSoup
import pymysql as m
import pandas as pd
import urllib.request
for page_num in range(1, 53+1):
url = f"https://www.hollys.co.kr/store/korea/korStore2.do?pageNo={page_num}&sido=&gugun=&store="
# print(url)
html = urllib.request.urlopen(url) #url열어주세요
soup = BeautifulSoup(html, 'html.parser')
tbody = soup.find("tbody")
trs = tbody.find_all("tr")
for tr in trs:
tds = tr.find_all("td")
con = m.connect(host="localhost", user="root",
db = "hollys",
password="1234", charset="utf8")
cur = con.cursor()
q_id =i
i+=1
q_local = tds[0].text
q_sotrename = tds[1].text
q_address = tds[3].text
q_phone = tds[5].text
sql = """insert into hollys0111 values (%s,%s,%s,%s, %s); """
cur.execute(sql, (q_id, q_local, q_storename, q_address, q_phone))
con.commit()
con.close()
df_hollys_sql = pd.DataFrame(columns=["지역","매장명","주소","전화번호"])
con = m.connect(host="localhost", user="root",
db = "hollys",
password="1234", charset="utf8")
cur = con.cursor()
sql = "select * from hollys0111;"
cur.execute(sql)
res = cur.fetchall()
for data in res:
line = pd.DataFrame({"지역":data[1], "매장명":data[2],
"주소":data[3],"전화번호":data[4]},
index=[data[0]])
df_hollys_sql = df_hollys_sql.append(line)
con.close()
C:\Users\user\AppData\Local\Temp\ipykernel_3544\2157192771.py:15: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
df_hollys_sql = df_hollys_sql.append(line)생략
df_hollys_sql
지역 | 매장명 | 주소 | 전화번호 | |
---|---|---|---|---|
0 | 경기 수원시 | 수원영통점\t | 경기도 수원시 영통구 청명남로 10 영통동 1000-1 | 031-202-3356 |
521 | 서울 강남구 | 수원영통점\t | 서울특별시 강남구 테헤란로 301 역삼동 701-02 삼정빌딩 1층 | 02-566-1002 |
522 | 경기 수원시 | 수원영통점\t | 경기도 수원시 영통구 청명남로 10 영통동 1000-1 | 031-202-3356 |
523 | 경기 고양시 덕양구 | 수원영통점\t | 경기 고양시 덕양구 권율대로 690 201동 108호~111호 | 031.967.0302 |
524 | 서울 용산구 | 수원영통점\t | 서울특별시 용산구 이태원로 180 2층~3층 | 02-749-8752 |
... | ... | ... | ... | ... |
1037 | 경기 성남시 수정구 | 수원영통점\t | 경기도 성남시 수정구 산성대로 265 (신흥동) 2층 할리스 | 031-626-6140 |
1038 | 서울 관악구 | 수원영통점\t | 서울특별시 관악구 신림로 353-1 | 02-877-0019 |
1039 | 서울 중구 | 수원영통점\t | 서울특별시 중구 세종대로 64, 해남빌딩 1층 (태평로2가 70-5) 할리스 | 02-755-7795 |
1040 | 부산 부산진구 | 수원영통점\t | 부산광역시 부산진구 동천로 73, DS타워 1~2층 (부전동 부전동 169-1) 할리스 | 051-819-9117 |
1041 | 서울 서대문구 | 수원영통점\t | 서울특별시 서대문구 연세로 34 (창천동 31-12) 할리스 | 02-393-2004 |
522 rows × 4 columns
!pip install selenium
Collecting selenium
Using cached selenium-4.7.2-py3-none-any.whl (6.3 MB)
Requirement already satisfied: urllib3[socks]~=1.26 in c:\anaconda\lib\site-packages (from selenium) (1.26.11)
Requirement already satisfied: certifi>=2021.10.8 in c:\anaconda\lib\site-packages (from selenium) (2022.9.14)
Collecting trio-websocket~=0.9
Using cached trio_websocket-0.9.2-py3-none-any.whl (16 kB)
Collecting trio~=0.17
Using cached trio-0.22.0-py3-none-any.whl (384 kB)
Requirement already satisfied: sortedcontainers in c:\anaconda\lib\site-packages (from trio~=0.17->selenium) (2.4.0)
Requirement already satisfied: attrs>=19.2.0 in c:\anaconda\lib\site-packages (from trio~=0.17->selenium) (21.4.0)
Collecting outcome
Using cached outcome-1.2.0-py2.py3-none-any.whl (9.7 kB)
Requirement already satisfied: sniffio in c:\anaconda\lib\site-packages (from trio~=0.17->selenium) (1.2.0)
Requirement already satisfied: cffi>=1.14 in c:\anaconda\lib\site-packages (from trio~=0.17->selenium) (1.15.1)
Collecting exceptiongroup>=1.0.0rc9
Downloading exceptiongroup-1.1.0-py3-none-any.whl (14 kB)
Requirement already satisfied: idna in c:\anaconda\lib\site-packages (from trio~=0.17->selenium) (3.3)
Collecting async-generator>=1.9
Using cached async_generator-1.10-py3-none-any.whl (18 kB)
Collecting wsproto>=0.14
Using cached wsproto-1.2.0-py3-none-any.whl (24 kB)
Requirement already satisfied: PySocks!=1.5.7,<2.0,>=1.5.6 in c:\anaconda\lib\site-packages (from urllib3[socks]~=1.26->selenium) (1.7.1)
Requirement already satisfied: pycparser in c:\anaconda\lib\site-packages (from cffi>=1.14->trio~=0.17->selenium) (2.21)
Collecting h11<1,>=0.9.0
Using cached h11-0.14.0-py3-none-any.whl (58 kB)
Installing collected packages: outcome, h11, exceptiongroup, async-generator, wsproto, trio, trio-websocket, selenium
Successfully installed async-generator-1.10 exceptiongroup-1.1.0 h11-0.14.0 outcome-1.2.0 selenium-4.7.2 trio-0.22.0 trio-websocket-0.9.2 wsproto-1.2.0
from selenium import webdriver
from bs4 import BeautifulSoup
import time
wd = webdriver.Chrome("chromedriver108.exe")
for store_num in range(100):
try:
wd.get("https://www.coffeebeankorea.com/store/store.asp") #주소로 이동
time.sleep(1)
wd.execute_script(f"storePop2('{store_num}')")
time.sleep(1)
html = wd.page_source
soupCB = BeautifulSoup(html,"html.parser")
store_name = soupCB.select("div.store_txt>h2")[0].text
store_info = soupCB.select("tbody>tr>td")
store_address = store_info[2].text
store_phone = store_info[3].text
print(store_name, store_address, store_phone, sep="/")
except:
print(store_num)
C:\Users\user\AppData\Local\Temp\ipykernel_3544\3161488534.py:4: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
wd = webdriver.Chrome("chromedriver108.exe")
0
학동역 DT점/서울시 강남구 학동로 211 1층 /02-3444-9973 생략
store_info = soupCB.select("tbody>tr>td")
store_info
[<td>평일 07:00~22:00ㅣ주말/공휴일 08:00~22:00</td>,
<td>DT(드라이브 스루) 매장입니다. (주차는 불가)</td>,
<td>서울시 강남구 학동로 211 1층 <!--span class="lot">(서울시 강남구 학동로 211 1층)</span--></td>,
<td>02-3444-9973</td>,
<td class="hallcake">홀케익 당일 수령가능</td>]
store_address = soupCB.select("tbody>tr>td")
store_address