Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

파이썬 스크립트

파이썬 으로 제주 맛집 주소를 찾아서 (2)

Billcorea 2021. 12. 23. 09:38
반응형

하하.. 제주도에는 어떤 맛집들이 있는지... 오늘도 찾아 본다...  하다 보니... 네이버 블로그는 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 을 이용해서 이 주소에 대한 정보를 검증해 보고 있는 중이다... 그리고 그 주소의 위치정보를 기록해 두고 있다. 무엇을 할려고 하는 지는 비밀(?) ㅋㅋㅋ

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

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

반응형