웹페이지를 크롤링하다보면 스크롤을 하지않으면 댓글이나 게시글이 보이지않는 경우가 있을것이다
예를 들어 유튜브의 댓글창 같은것 말이다. 스크롤을 하지않으면 댓글이 웹브라우저의 정보가 추가 되지않는다
그럴 경우에는 스크롤을 내려 정보를 모두 가져온 후에 웹페이지정보를 가져와 크롤링을 시도해야한다.
options = webdriver.ChromeOptions()
# options.add_argument('--headless') # 창 새로 띄우는 것 없이
options.add_argument('--disable-gpu') # gpu 사용안하겠다 괜한 오류나오니깐
browser = webdriver.Chrome(options=options)
browser.maximize_window()
browser.get(url)
sleep_time = 1
# 스크롤 높이 가져옴
last_height = browser.execute_script("return document.body.scrollHeight")
while True:
# 끝까지 스크롤 내리기
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 대기
time.sleep(sleep_time)
# 스크롤 내린 후 스크롤 높이 다시 가져옴
new_height = browser.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
def get_coordinate(address): # 주소를 입력받음
result = ""
url = 'https://dapi.kakao.com/v2/local/search/address.json?query=' + address # 카카오 api 서버스를 이용하여 접근
rest_api_key = 'api키이빈다' # 사용자 api key
header = {'Authorization': 'KakaoAK ' + rest_api_key}
r = requests.get(url, headers=header)
if r.status_code == 200: # 정보를 오류없이 받아왔다면
if len(r.json()['documents']) != 0: # 길이가 0이 아니라면
try :
result_address = r.json()["documents"][0]["address"]
result = (result_address["y"],result_address["x"]) # 좌표 정보에 접근
except: # 예외처리
result = np.nan
else: # 길이가 0인경우 na처리
result = np.nan
else:
result = "ERROR[" + str(r.status_code) + "]"
return result # 좌표를 반환
get_coordinate('수원시 권선구 권선로669번길 34(권선동) (권선동 1011-15)')
이렇게 나의 인증키, 주소, 요청인자들을 활용해 하나의 url을 만들고 해당 html구문을 분석하여
원하는 정보를 가져오면 된다.
res = requests.get(request_query)
soup = BeautifulSoup(res.text, 'lxml')
items = soup.find_all('item')
for item in items:
day = item.locdate.get_text()
name = item.datename.get_text()
print(name, ' : ', day)
추석 : 20210920
추석 : 20210921
추석 : 20210922
포문을 활용하면 이렇게
import requests
import datetime
import pandas as pd
from bs4 import BeautifulSoup
import urllib.parse as urlparse
def get_request_query(url, operation, params, serviceKey):
params = urlparse.urlencode(params)
request_query = url + '/' + operation + '?' + params + '&' + 'serviceKey' + '=' + serviceKey
return request_query
mykey = "인증키공개 ㄴㄴ"
url = 'http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService'
operation = 'getRestDeInfo'
df = pd.DataFrame()
for year in [2019,2020,2021]:
for month in range(1,13):
if month < 10:
month = '0' + str(month)
else:
month = str(month)
params = {'solYear':year, 'solMonth':month}
request_query = get_request_query(url, operation, params, mykey)
res = requests.get(request_query)
soup = BeautifulSoup(res.text, 'lxml')
items = soup.find_all('item')
for item in items:
day = item.locdate.get_text()
name = item.datename.get_text()
data = {'휴일이름':name , '날짜':day}
df = df.append(data, ignore_index=True)
display(df.head())
display(df.tail())