데이터공부
python을 사용하여 치킨집 주소 크롤링, folium으로 맵에 표시하기 - 장모님치킨 본문
수업 때 진행했던 내용이지만 처음으로 처음부터 끝까지 혼자 크롤링 해본 자료라 당시에 정말 재밌게 했던 것 같다.
import requests
from bs4 import BeautifulSoup
import json
import folium
url = 'http://jangmonim.co.kr/bizdemo33985/store/sub1.php?&com_board_search_code=&com_board_search_value1=&com_board_search_value2=&com_board_page=10&&com_board_id=4&&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_search_code=&com_board_search_value1=&com_board_search_value2=&com_board_page='
page=1
url= url+str(page)
namelist = list()
addrlist = list()
response = requests.get(url)
data = BeautifulSoup(response.content,'html.parser')
data = data.find('table')
name_all = data.select('td.bbsnewf5')
len(name_all)
데이터가 너무 길어서 생략
- 태그를 보고 전화번호, 매장이름 , 매장주소 추출
data.select('td.bbsetc_add1')[0].text
data.select('td.bbsnewf5')[0].text.replace('\n','').strip()
data.select('td.bbsetc_add2')[0].text
'055-884-0133'namelist = list()
addrlist = list()
numlist = list()
for i in range(1,14):
url = 'http://jangmonim.co.kr/bizdemo33985/store/sub1.php?&com_board_search_code=&com_board_search_value1=&com_board_search_value2=&com_board_page=10&&com_board_id=4&&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_category_code=c15&com_board_search_code=&com_board_search_value1=&com_board_search_value2=&com_board_page='
page=i
url = url+str(page)
response = requests.get(url)
data = BeautifulSoup(response.content,'html.parser')
data = data.find('table')
name_all = data.select('td.bbsnewf5')
for j in range(0,len(name_all)):
namelist.append(data.select('td.bbsnewf5')[j].text.replace('\n','').strip())
addrlist.append(data.select('td.bbsetc_add1')[j].text)
numlist.append(data.select('td.bbsetc_add2')[j].text)
검색이 되지 않는 주소들의 리스트 번호를 알아낸 후, 카카오맵 기준으로 찾아서 수정
print(len(namelist),len(addrlist))
addrlist[19]='경남 합천군 쌍책면 성산리 622'
addrlist[58]='경상남도 창원시 성산구 사파동 93'
addrlist[62]='경상남도 창원시 의창구 팔용동 123-2'
addrlist[69]='경상남도 창원시 성산구 남양동 24'
addrlist[78]='경남 함안군 법수면 윤내리 442-2'
addrlist[81]='경상남도 의령군 유곡면 송산리 1525-1'
addrlist[82]='경남 의령군 정곡면 중교리 420-1'
addrlist[87]='경남 창원시 마산합포구 산호동 336-5'
addrlist[108]='밀양시 삼랑진읍 송지리 156-115'
addrlist[113]='경상남도 양산시 중부동 696-1'
addrlist[123]
124 124
'경남 김해시 대성동 135-14'- 미리 발급받아놓은 카카오api 불러오기
with open('account_id.json','r')as f:
data = f.read()
json_data = json.loads(data) #str ->obj
app_id = json_data['kakao']['app_id']
app_key = json_data['kakao']['app_key']
# print(app_id,app_key)
def getLatLng(addr):
with open('account_id.json','r')as f:
data = f.read()
json_data = json.loads(data) #str ->obj
app_id = json_data['kakao']['app_id']
app_key = json_data['kakao']['app_key']
app_key = 'KakaoAK '+ app_key
url = 'https://dapi.kakao.com/v2/local/search/address.json?query='+addr
headers = {'Authorization' : app_key}
result = requests.get(url, headers=headers)
result_json = json.loads(str(result.text))
x=result_json['documents'][0]['address']['x']
y=result_json['documents'][0]['address']['y']
return(y,x)
함수를 사용하면 한번에 되지 않음 -> 주소가 한변에 변환이 되지 않음
# (y,x)=getLatLng('경남 김해시 대성동 135-14')
# map_thej = folium.Map(location=(y,x),zoom_start=17)
# map_thej
- 변환되지 않는 주소의 인덱스 찾기
# i = 0
# for j in addrlist:
# print(i)
# (y,x)=getLatLng(j)
# i+=1
(y,x)=getLatLng('경상남도 창원시 의창구 북면 마산리')
ylist=list()
xlist=list()
chicken_map = folium.Map(location=(y,x),zoom_start=9)
for i in range(0,len(addrlist)):
(y,x)=getLatLng(addrlist[i])
ylist.append(y)
xlist.append(x)
folium.Marker((y,x), popup =namelist[i],icon=folium.Icon(color='lightred',icon='glyphicon glyphicon-cutlery')).add_to(chicken_map)
chicken_map
매장명, 주소, 번호, 위,경도를 한번에 묶은 리스트 생성
jangmonimlist=list()
for i in range(0,len(namelist)):
shoplist=list()
shoplist.append(namelist[i])
shoplist.append(addrlist[i])
shoplist.append(numlist[i])
shoplist.append(ylist[i])
shoplist.append(xlist[i])
jangmonimlist.append(shoplist)
jangmonimlist[0:3]
['금남점',
'경남 하동군 금남면 경남 하동군 금남면 사궁길 11',
'055-884-0133',
'34.997222823762385',
'127.81083722826276'],
['신안점',
'경상남도 진주시 신안동 13-14 1층',
'055-476-0677',
'35.18668688904107',
'128.0700231286068'],
['길곡점',
'경상남도 창녕군 길곡면 증산리 701',
'055-536-0890',
'35.38543320023189',
'128.57029654588757']뽑아오기 편하게 딕셔너리형태로도 만들어서 리스트에 담아봄
jangmonimdict = list()
for i in range(0,len(namelist)):
kyodict=dict()
kyodict['매장명']=namelist[i]
kyodict['매장주소']=addrlist[i]
kyodict['매장번호']=numlist[i]
kyodict['y']=ylist[i]
kyodict['x']=xlist[i]
jangmonimdict.append(kyodict)
jangmonimdict[0]
{'매장명': '금남점',
'매장주소': '경남 하동군 금남면 경남 하동군 금남면 사궁길 11',
'매장번호': '055-884-0133',
'y': '34.997222823762385',
'x': '127.81083722826276'}- 잘 담겨있다.
- 매장정보를 각각 피클, json, sqlite의 형태로 저장해보기로 한다.
import pytofile
# pytofile.to_csv(jangmonimlist, data_type = 'list', file_name = 'jangmonimcsv', headers = False, save_time = True)
# pytofile.to_json(jangmonimdict, file_name = 'jangmonim_j', save_time = True)
# pytofile.to_pickle(jangmonimlist, file_name = 'jangmonim_p', save_time = True)
# pytofile.to_sqlitedb(jangmonimlist, dbname = 'chicken', tbname = 'jangmonim' )
import pandas as pd
import sqlite3
conn = sqlite3.connect('chicken.sqlite')
pd.read_sql('select * from jangmonim',conn)
| 0 | 1 | 2 | 3 | 4 | |
|---|---|---|---|---|---|
| 0 | 금남점 | 경남 하동군 금남면 경남 하동군 금남면 사궁길 11 | 055-884-0133 | 34.997222823762385 | 127.81083722826276 |
| 1 | 신안점 | 경상남도 진주시 신안동 13-14 1층 | 055-476-0677 | 35.18668688904107 | 128.0700231286068 |
| 2 | 길곡점 | 경상남도 창녕군 길곡면 증산리 701 | 055-536-0890 | 35.38543320023189 | 128.57029654588757 |
| 3 | 곤양점 | 경남 사천시 곤양면 성내리 105 | 055-853-9982 | 35.057397970480785 | 127.9616792035626 |
| 4 | 진동점 | 경상남도 창원시 마산합포구 진동면 진북산업로 36 | 055-271-9191 | 35.11910826176575 | 128.48831516975162 |
| 5 | 김해부원점 | 김해시 호계로 451-1 | 055-338-9959 | 35.23077944027312 | 128.88445840668962 |
| 6 | 신기점 | 경남 양산시 고향의봄로 30 | 055-363-9985 | 35.35283737892165 | 129.04670975437634 |
| 7 | 안하점 | 경상남도 김해시 한림면 명동로 176 | 055-343-0014 | 35.30543262191181 | 128.82409333933978 |
| 8 | 대지점 | 경상남도 창녕군 대지면 모산리 506-4 | 055-533-9298 | 35.555649668771125 | 128.46691067859578 |
| 9 | 신촌점 | 경남 창원시 성산구 신촌로 7 | 055-286-3884 | 35.20859172846706 | 128.62648738554293 |
| 10 | 구산점 | 경상남도 김해시 구산동 257 백조아파트상가 18호 | 055-321-7701 | 35.2450789507104 | 128.87404578621673 |
| 11 | 악양점 | 경상남도 하동군 악양면 정서리 악양동로 379-5 | 055-883-8857 | 35.16149127528984 | 127.70957453412707 |
| 12 | 남해대교점 | 경남 하동군 금남면 구노량길46 | 055-883-5220 | 34.94867164042356 | 127.87732435020564 |
| 13 | 생림점 | 경남 김해시 생림면 봉림리 569-2 | 055=321-9422 | 35.326013709381364 | 128.8491300615257 |
| 14 | 자은점 | 경남 창원시 진해구 자은동 663-8번지 1층 | 055-547-9948 | 35.14145438253037 | 128.7050679885661 |
| 15 | 북면점 | 경남 창원시 의창구 북면 천주로 1075 1층 | 055-298-6409 | 35.34668093892348 | 128.60730959184065 |
| 16 | 초동점 | 경남 밀양시 초동면 초동로 310번지 | 055-391-2118 | 35.41194297381232 | 128.69045784279953 |
| 17 | 양보점 | 경남 하동군 양보면 진양로 736-1 | 055-884-7311 | 35.047264326430955 | 127.8453739484121 |
| 18 | 안의점 | 경남 함양군 안의면 종로길 1 | 055-962-9982 | 35.62837528236298 | 127.81245855305465 |
| 19 | 쌍책점 | 경남 합천군 쌍책면 성산리 622 | 055-933-9958 | 35.577703909948255 | 128.28300922511463 |
| 20 | 반지점 | 경남 창원시 의창구 봉곡동 140-1 | 055-276-2028 | 35.246339622930535 | 128.67112720703497 |
| 21 | 해금강점 | 경남 거제시 남부면 갈곶리 336-2 | 055-636-3567 | 34.740710150889356 | 128.66045474362997 |
| 22 | 학동점 | 경남 거제시 동부면 학동6길 18 | 055-636-1925 | 34.77336491546449 | 128.64029448370238 |
| 23 | 지수점 | 경남 진주시 지수면 지수로 470 장모님치킨 지수점 | 055-763-9982 | 35.23354790273804 | 128.26950796407775 |
| 24 | 감계화천점 | 경남 창원시 의창구 북면 천주로 470 1층 | 055-291-9984 | 35.29862884065675 | 128.6039929648051 |
| 25 | 마산직영점 | 창원시 마산합포구 문화의길 36(오동동) | 055-247-9985 | 35.20705948423982 | 128.5782958835337 |
| 26 | 봉산점 | 경남 합천군 봉산면 김봉리 337-6 | 055-933-0092 | 35.62780725059026 | 128.04260798440362 |
| 27 | 수동점 | 경상남도 함양군 수동면 수동길 22 (화산리) | 055-964-9985 | 35.52166326331872 | 127.78718972767423 |
| 28 | 가조점 | 경남 거창군 가조면 마상리 183-14 | 055-943-9982 | 35.708186609913675 | 128.0156314752431 |
| 29 | 주공점 | 경남 거창군 거창읍 대동리 95-11 | 055-942-6677 | 35.68897162738545 | 127.92398761327473 |
| ... | ... | ... | ... | ... | ... |
| 94 | 장군점 | 경남 창원시 마산합포구 장군동4가 22-5번지 | 055-246-0117 | 35.197084766768974 | 128.5641152200635 |
| 95 | 자산점 | 경남 창원시 마산합포구 자산동 299-100 | 055-247-4988 | 35.203115642644015 | 128.5660843197401 |
| 96 | 회원·교방점 | 경남 창원시 마산합포구 교방동 196-16 | 055-248-5006 | 35.21100586241153 | 128.5664423055509 |
| 97 | 호계코오롱점 | 경남 창원시 마산회원구 내서읍 호계리 53 한백상가 104 | 055-232-9921 | 35.267287822796625 | 128.52340713550447 |
| 98 | 중리점 | 경남 창원시 마산회원구 내서읍 호원로 186 | 055-231-0880 | 35.25065470855706 | 128.5225377166821 |
| 99 | 삼계점 | 경상남도 창원시 마산회원구 내서읍 삼계9길 49-1 (삼계리) 101동 1층 2호 ... | 055-231-7272 | 35.23241833577125 | 128.49847538027606 |
| 100 | 상곡점 | 경남 창원시 마산회원구 내서읍 중리상곡로5 | 055-231-9981 | 35.24303301888093 | 128.50328463298814 |
| 101 | 덕재점 | 경남 창원시 마산회원구 구암서2길 24 | 055-297-1225 | 35.24741150605199 | 128.59053395594273 |
| 102 | 합성점 | 경남 창원시 마산회원구 합성동 694-1 | 055-292-0330 | 35.23945026281868 | 128.57881784820574 |
| 103 | 동마산점 | 경남 창원시 마산회원구 합성동 351-24 | 055-297-6976 | 35.23618711382796 | 128.58768725004597 |
| 104 | 소계.구암점 | 경남 창원시 의창구 소계로 79,1층(소계동) | 055-299-2668 | 35.2564415820645 | 128.59957493072065 |
| 105 | 봉암.양덕1점 | 경남 창원시 마산회원구 봉암동 454-3 | 055-297-0152 / 055-292-2168 | 35.222283794709064 | 128.59720850611814 |
| 106 | 양덕.한일점 | 경남 창원시 마산회원구 양덕동 63-10 | 055-294-2323 / 055-296-3601 | 35.23066044399119 | 128.58220625870058 |
| 107 | 서마산회성점 | 경남 창원시 마산회원구 회성동 467-24번지 | 055-256-3180 | 35.231558340332 | 128.56555443694825 |
| 108 | 삼랑진점 | 밀양시 삼랑진읍 송지리 156-115 | 055-352-9833 | 35.399729598560974 | 128.8411135867331 |
| 109 | 수산점 | 경남 밀양시 하남읍 수산리 449-11 | 055-391-0019 | 35.374717260430764 | 128.70960978055203 |
| 110 | 부북점 | 경남 밀양시 부북면 운전리 485-6 | 055-355-2791 | 35.51084270336593 | 128.72935440759886 |
| 111 | 산내점 | 경남 밀양시 산내면 송백리 1349-11 | 055-352-6454 | 35.585200082303 | 128.8809210768754 |
| 112 | 남명점 | 경남 밀양시 산내면 남명리 1116-4 | 055-352-6454 | 35.58779943985804 | 128.95293568171863 |
| 113 | 신도시점 | 경상남도 양산시 중부동 696-1 | 055-367-9989 | 35.33824692131217 | 129.03385292180388 |
| 114 | 웅상점 | 경남 양산시 소주동 147-1 | 055-362-9292 | 35.410389096320785 | 129.15979415004935 |
| 115 | 북부점 | 경남 양산시 북부동 480-21 | 055-381-9995 | 35.3469280701833 | 129.0369830227265 |
| 116 | 외동점 | 경남 김해시 외동 705-1 동성아파트상가 7 | 055-326-2888 | 35.23543346997759 | 128.85175053941 |
| 117 | 오거리점 | 경남 김해시 대동면 덕산리 750-2번지 | 055-323-0280 | 35.28179239881222 | 128.9801762626616 |
| 118 | 진례점 | 경남 김해시 진례면 송정리 234 | 055-345-5635 | 35.24832306548616 | 128.74861462542458 |
| 119 | 한림점 | 경남 김해시 한림면 가동리 660 | 055-345-2131 | 35.32112569231001 | 128.76572023534865 |
| 120 | 장유점 | 경남 김해시 장유면 무계리 196-4번지 1층 | 055-328-9985 | 35.200711842407486 | 128.81537133357273 |
| 121 | 진영점 | 경남 김해시 진영읍 여래리 448-11 | 055-343-5611 | 35.30258499110249 | 128.73769783281085 |
| 122 | 동김해점 | 경남 김해시 지내동 67 동원APT 상가 11-107호 | 055-329-3459 | 35.23035212439192 | 128.92375502076317 |
| 123 | 대성점 | 경남 김해시 대성동 135-14 | 055-332-5196 | 35.23898847833045 | 128.8776666761529 |
124 rows × 5 columns
# pytofile.to_tinydb(jangmonimdict, dbname = 'chicken', tbname = 'jangmonim')