파이썬 이것저것/크롤링

[파이썬] 서울시 주유소 크롤링

agingcurve 2022. 6. 5. 12:33
반응형
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")