반응형
하하.. 제주도에는 어떤 맛집들이 있는지... 오늘도 찾아 본다... 하다 보니... 네이버 블로그는 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 을 이용해서 이 주소에 대한 정보를 검증해 보고 있는 중이다... 그리고 그 주소의 위치정보를 기록해 두고 있다. 무엇을 할려고 하는 지는 비밀(?) ㅋㅋㅋ
찾아 가려면 주소를 알아야 하니까 ... 이렇게 수집된 정보를 이용해서 어디 갈 때 좀 편하게 가 보자...
테스트 하면서 작성하는 중이라, 글이 좀 지저분 해도 양해를 부탁 드려요...
반응형
'파이썬 스크립트' 카테고리의 다른 글
파이썬 으로 qrcode 만들어 보기. (2) | 2022.01.12 |
---|---|
파이썬으로 제주의 맛집을 찾아서 (3) (2) | 2021.12.24 |
파이썬 으로 제주맛집 스크래핑 (3) | 2021.12.22 |
파이썬으로 sqlite 테이블에 칼럼을 새로 추가 하기 (3) | 2021.12.21 |
파이썬 자동화 스크립트 : 메일 보내기 (0) | 2021.12.20 |