반응형
from selenium import webdriver
from tqdm import tqdm_notebook
from urllib.request import urlopen, Request
import pandas as pd
import matplotlib_hangle
import time
import numpy as np
import googlemaps
EDA 웹크롤링 (3월 11일)
- 주유소 데이터 불러와서 데이터 프레임으로 정리
url = "https://www.opinet.co.kr/searRgSelect.do"
- 서울 -> 각 구를 번갈아 선택
- 웹크롤링을 통해서 데이터를 갖고와야 함
- 부가데이터(세차장, 충전소, 경정비, 편의점, 24시간 운영) 유무에 대한 데이터도 포함해서 가져와야 함
- padas 데이터 프레임으로 정리하며 부가데이터는 Y 또는 N으로 저장

driver = webdriver.Chrome("chromedriver.exe")
# 홈페이지 접속
driver.get("https://www.opinet.co.kr/searRgSelect.do")
# 지역별 접속
driver.get("https://www.opinet.co.kr/searRgSelect.do")
- 주유소명을 클릭하고 이름 정보 갖고오고 보통휘발유, 경유, 갖고오기
- 부가정보에 if off가 되어있으면 N 아니면 Y로 갖고오기
- 다돌고 다음거 누르기
# 서울클릭
driver.find_element_by_css_selector("#SIDO_NM0").send_keys("서울")
# 강남클릭
driver.find_element_by_css_selector("#SIGUNGU_NM0").send_keys("강남구")
# beautifulsoup으로 tbody 넘겨주기
html = driver.page_source
soup = BeautifulSoup(html,"html.parser")
driver.find_element_by_css_selector("#body1 > tr:nth-child(34) > td.rlist > a").click()
# 해당하는 값 클릭
# for문 돌릴때 구별 주유소 숫자만큼 child에 넣어주기
driver.maximize_window()
driver.find_element_by_css_selector("#body1 > tr:nth-child(1) > td.rlist > a").click()
# 거기서 나오는 정보
html = driver.page_source
soup = BeautifulSoup(html,"html.parser")
# 주유소명
soup.select_one("#os_nm").text
# 주소
soup.select_one("#rd_addr").text
# 상표(회사)
soup.select_one("#poll_div_nm").text
# 휘발유
soup.select_one("#b027_p").text
# 경유
soup.select_one("#d047_p").text
# 셀프여부
if soup.select_one("#self_icon")["id"] == 'self_icon':
print("Y") # 셀프에 저장
else:
print("N") # 셀프에 저장
# 세차장
if "off" in soup.select_one("#cwsh_yn")["src"]:
세차장 = "Y"
else:
세차장 = "N"
# 충전소
if "off" in soup.select_one("#lpg_yn")["src"]:
충전소 = "Y"
else:
충전소 = "N"
# 경정비
if "off" in soup.select_one("#maint_yn")["src"]:
경정비 = "Y"
else:
경정비 = "N"
# 편의점
if "off" in soup.select_one("#cvs_yn")["src"]:
편의점 = "Y"
else:
편의점 = "N"
# 24시간
if "off" in soup.select_one("#sel24_yn")["src"]:
이십사시간 = "Y"
else:
이십사시간 = "N"
# 구
구 = soup.select_one("#rd_addr").text.split()[1]
자동화
datas = []
for gu in tqdm_notebook(gu_list):
driver.find_element_by_css_selector("#SIGUNGU_NM0").send_keys(gu)
driver.maximize_window()
search_result = int(driver.find_element_by_css_selector("span > #totCnt").text)
for juyu in range(1, search_result +1):
driver.find_element_by_css_selector(f"#body1 > tr:nth-child({juyu}) > td.rlist > a").click()
html = driver.page_source
soup = BeautifulSoup(html,"html.parser")
# 주유소명
이름 = soup.select_one("#os_nm").text
# 주소
주소 = soup.select_one("#rd_addr").text
# 상표(회사)
브랜드 = soup.select_one("#poll_div_nm").text
# 휘발유
휘발유 = soup.select_one("#b027_p").text
# 경유
경유 = soup.select_one("#d047_p").text
# 셀프여부
try:
soup.select_one("#self_icon")["id"] == 'self_icon'
셀프여부 = "Y" # 셀프에 저장
except:
셀프여부 = "N" # 셀프에 저장
# 세차장
if "off" in soup.select_one("#cwsh_yn")["src"]:
세차장 = "N"
else:
세차장 = "Y"
# 충전소
if "off" in soup.select_one("#lpg_yn")["src"]:
충전소 = "N"
else:
충전소 = "Y"
# 경정비
if "off" in soup.select_one("#maint_yn")["src"]:
경정비 = "N"
else:
경정비 = "Y"
# 편의점
if "off" in soup.select_one("#cvs_yn")["src"]:
편의점 = "N"
else:
편의점 = "Y"
# 24시간
if "off" in soup.select_one("#sel24_yn")["src"]:
이십사시간 = "N"
else:
이십사시간 = "Y"
# 구
구 = soup.select_one("#rd_addr").text.split()[1]
time.sleep(0.2)
datas.append({
"이름":이름,
"주소":주소,
"브랜드":브랜드,
"휘발유":휘발유,
"경유":경유,
"셀프여부":셀프여부,
"세차장":세차장,
"충전소":충전소,
"경정비":경정비,
"편의점":편의점,
"이십사시간":이십사시간,
"구":구
})
df = pd.DataFrame(datas)
df
# 위치정보 가져오기
df["lat"] = np.nan
df["lng"] = np.nan
gmaps_key =
gmaps= googlemaps.Client(key=gmaps_key)
for idx, row in tqdm_notebook(df.iterrows()):
tmp = gmaps.geocode(row["주소"], language="ko")
tmp[0].get("formatted_address")
lat = tmp[0].get("geometry")["location"]["lat"]
lng = tmp[0].get("geometry")["location"]["lng"]
df.loc[idx,"lat"] = lat
df.loc[idx,"lng"] = lng
# 한글컬럼 변경
df.rename(columns={"이십사시간":"24시간"},inplace = True)
df.info()
# 데이터 저장
df.to_excel("서울시주유소데이터.xlsx")
'파이썬 이것저것 > 크롤링' 카테고리의 다른 글
[파이썬] Naver API 등록해서 사용해보기 (0) | 2022.06.04 |
---|---|
[파이썬] 네이버 영화 평점 데이터 분석해보기 (0) | 2022.06.04 |
[파이썬] 스타벅스, 이디야 매장 크롤링 및 분석 (0) | 2022.04.24 |
[크롤링] GS25 매장 크롤링 -1 (0) | 2022.04.17 |