Notice
Recent Posts
Recent Comments
Link
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

데이터공부

python을 사용하여 치킨집 주소 크롤링, folium으로 맵에 표시하기 - 장모님치킨 본문

카테고리 없음

python을 사용하여 치킨집 주소 크롤링, folium으로 맵에 표시하기 - 장모님치킨

bo보bo 2020. 2. 5. 03:14
수업 때 진행했던 내용이지만 처음으로 처음부터 끝까지 혼자 크롤링 해본 자료라 당시에 정말 재밌게 했던 것 같다.
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')