2026/02/22

오늘의 이야기

하하.. 제주도에는 어떤 맛집들이 있는지... 오늘도 찾아 본다...  하다 보니... 네이버 블로그는 iframe 으로 둘러 쌓여 있어 한번 더 스크랩을 해야 하는 불편(?)한 점을 발견 했다. 


오늘은 버전은 스크랩 한 자료를 그냥 흘려 버리는 것이 아니라, 파이썬에서 구동 할 수 있는 작은 db 에 저장을 해 보도록 하겠다.


그럼... 소스를 


import requests
from bs4 import BeautifulSoup
import urllib
import sqlite3
from datetime import datetime
import re
import json

conn = sqlite3.connect("opDeGangDB.sqlite", isolation_level=None)
rs = conn.cursor()
rs.execute('''CREATE TABLE IF NOT EXISTS chejuList1
(id integer PRIMARY KEY, url text, Name text, writeDate text)''')

rs.execute('''CREATE TABLE IF NOT EXISTS localAddr
(id integer PRIMARY KEY, url text, address text, lat float, lot float, writeDate text)''')

insSql = '''
insert into chejuList1 (url, name, writeDate)
values ('{0}', '{1}', '{2}')
'''

insJusoSql = '''
insert into localAddr (url, address, lat, lot, writeDate)
values ('{0}', '{1}', {2}, {3}, '{4}')
'''

urlKakao = 'https://dapi.kakao.com/v2/local/search/address.json'
REST_API_KEY = '6................................8'
headers = {'Authorization': 'KakaoAK {0}'.format(REST_API_KEY)}

def location_data(url, address):
params = {'query': '{0}'.format(address)}
resp = requests.get(urlKakao, params=params, headers=headers, verify=True)
rValue = ''
#print(resp.json()['meta'])
try:
if resp.json()['meta']['total_count'] > 0:
rValue = resp.json()['documents'][0]['road_address']
except:
rValue = ''
return rValue

searchKey = '제주맛집'
for idx in range(1, 100):
print(idx)
url = "https://search.daum.net/search?w=blog&m=board&collName=blog_total&q={0}&spacing=0&DA=PGD&p={1}".format(urllib.parse.quote_plus(searchKey), idx)
response = requests.get(url, verify=False)
bs = BeautifulSoup(response.text, 'html.parser')
for item in bs.find_all(class_="f_link_b"):
rs.execute(''' select count(*) from chejuList1 where url = "{0}" '''.format(item['href']))
if rs.fetchone()[0] == 1:
pass
else:
print(item['href'] + ' ' + item.text)
rs.execute(insSql.format(item['href'], item.text.replace("'",""), datetime.today().strftime("%Y%m%d%H%M%S")))

def getAddr(url, text):
if (len(re.findall(r'제주시', text)) > 0 or len(re.findall(r'서귀포시', text)) > 0) and (len(re.findall(r'로', text)) > 0 or len(re.findall(r'면', text)) > 0 or len(re.findall(r'읍', text)) > 0):
strText = re.findall(r'\w+', text)
idx = 0
for iStr in strText:
if '제주' in iStr:
strAddr = ''
for i in range(idx, len(strText)):
strAddr += strText[i] + ' '
addrStr = location_data(url, strAddr)
if addrStr != None and len(addrStr) > 0:
#print(addrStr['address_name'] + ' ' + addrStr['y'] + ' ' + addrStr['x'])
rs.execute(insJusoSql.format(url, addrStr['address_name'], addrStr['y'], addrStr['x'], datetime.today().strftime("%Y%m%d%H%M%S")))
return True
idx += 1
return False
else:
return False

rs.execute(''' select url, Name, writeDate from chejuList1 ''')
items = rs.fetchall()
for item in items:
print(item[0] + ' ' + item[1])
response = requests.get(item[0], verify=True)
bs = BeautifulSoup(response.text, 'html.parser')
text1 = ''
if 'blog.naver' in item[0]:
iframexx = bs.find_all('iframe')
for iframe in iframexx:
res = requests.get('https://blog.naver.com/' + iframe.attrs['src'])
bs = BeautifulSoup(res.text, 'html.parser')
text1 = re.sub('(<([^>]+)>)', '', bs.get_text())
else:
text1 = re.sub('(<([^>]+)>)', '', bs.get_text())
tt = ''
for line in text1.split('\n'):
if line.strip() != '':
text = line.strip()
if getAddr(item[0], line.strip()):
print('R=' + text)

print('Job End')

중간에 있는 location_data 는 카카오 api 을 이용해서 이 주소에 대한 정보를 검증해 보고 있는 중이다... 그리고 그 주소의 위치정보를 기록해 두고 있다. 무엇을 할려고 하는 지는 비밀(?) ㅋㅋㅋ


찾아 가려면 주소를 알아야 하니까 ... 이렇게 수집된 정보를 이용해서 어디 갈 때 좀 편하게 가 보자...


테스트 하면서 작성하는 중이라, 글이 좀 지저분 해도 양해를 부탁 드려요...





댓글 없음:

댓글 쓰기

오늘의 이야기

예전에 어떤 앱을 만들기 할 때 사용했던 음력 변환 하는 소스를 어딘가에서 찾았던 거 같은데... 다시 한번 기억해 보기 위해서 적어 보기로 했다.    https://billcorea.tistory.com/4   구글로간 음력 설명서 새로운 버젼으로...