selenium

ganadara·2023년 1월 11일
0

python

목록 보기
5/10

maria DB 엑세스가 거부되었습니다.

엑세스가 거부되었습니다 -> 명령프롬프트 우클릭 관리자 권한으로 실행

  • database 지우기
drop database hollys;

selenium - 주소 구하기


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 생략

dataframe에 넣기

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

maria DB

"""
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')

BeautifulSoup

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
profile
DL 공부중

0개의 댓글