EDA 3 - Web Data (2)

subinii·2024년 4월 11일

DS 25기

목록 보기
22/46
post-thumbnail

예제 3. 시카고 맛집 데이터 분석

목표

  • 시카고 매거진
  • 총 50개 페이지에서 각 가게의 정보를 가져온다.
  • 가게이름
  • 대표 메뉴
  • 대표 메뉴의 가격
  • 가게 주소

메인페이지 가져오기

from urllib.request import Request, urlopen 
from bs4 import BeautifulSoup


url_base = "https://www.chicagomag.com/"
url_sub = "chicago-magazine/november-2012/best-sandwiches-chicago/"
url = url_base + url_sub

req = Request(url, headers={"User-Agent": "Chrome"})
html = urlopen(req)
soup = BeautifulSoup(html, "html.parser")
print(soup.prettify())

가져올 데이터 확인하기

1. 랭킹 확인하기 
tmp_one.select_one(".sammyRank").text
2. url 
tmp_one.select_one("a")["href"]
3. 메뉴 이름, 가게 이름 
tmp_one.select_one(".sammyListing").get_text()
4. 메뉴 이름 텍스트 나누기 
import re 
tmp_str = tmp_one.find(class_="sammyListing").get_text()
re.split(("\n|\r\n"), tmp_str)

4) 반환 값

추출한 데이터 합치기

  • 리스트로 하나씩 컬럼을 만들고, DateFram으로 합치기
from urllib.parse import urljoin 
url_base = "http://www.chicagomag.com"
rank = [] 
main_menu = [] 
cafe_name = [] 
url_add = [] 
list_soup = soup.find_all("div", "sammy") # soup.select(".sammy")
for item in list_soup: 
    rank.append(item.find(class_="sammyRank").get_text())
    tmp_str = item.find(class_="sammyListing").get_text() 
    main_menu.append(re.split(("\n|\r\n"), tmp_str)[0])
    cafe_name.append(re.split(("\n|\r\n"), tmp_str)[1])
    url_add.append(urljoin(url_base, item.find("a")["href"]))
import pandas as pd
data ={
    "Rank" : rank, 
    "Menu" : main_menu,
    "Cafe" : cafe_name,
    "URL" : url_add
}
df = pd.DataFrame(data)

하위페이지 가져오기

  • 가격
  • 주소 가져오기

import

# requirements 
import pandas as pd 
from urllib.request import urlopen, Request
from fake_useragent import UserAgent
from bs4 import BeautifulSoup

html 가져오기

req = Request(df["URL"][0], headers={"user-agent":"ua.chrome"})
html = urlopen(req).read()
soup_tmp = BeautifulSoup(html, "html.parser")
soup_tmp.find("p", "addy") # soup_find.select_one(".addy")
  • regular expression를 사용하여 글자 나누기

추출한 데이터 합치기

  • tadm : for문이 사용시 작동이 끝날때까지 작동하는 지 알 수 있음
from tqdm import tqdm 
price = [] 
address = [] 
for idx, row in tqdm(df.iterrows()):
    req = Request(row["URL"], headers={"ua.chrome"})
    html = urlopen(req).read()
    soup_tmp = BeautifulSoup(html, "html.parser")
    gettings = soup_tmp.find("p", "addy").get_text()
    price_tmp = re.split(".,", gettings)[0]
    tmp = re.search("\$\d+\.(\d+)?", price_tmp).group()
    price.append(tmp)
    address.append(price_tmp[len(tmp)+2:])
    print(idx)

시카고 맛집 데이터 지도 시각화

import

import folium
import pandas as pd
import numpy as np
import googlemaps 
from tqdm import tqdm
gmaps_key = "고유키"
gmaps = googlemaps.Client(key=gmaps_key)

주소를 통해 위도 경도 추출하기

  • geocode
lat = []
lng = []

for idx, row in tqdm(df.iterrows()):
    if not row["Address"] == "Multiple location":
        target_name = row["Address"] + ", " + "Chicago"
        # print(target_name)
        gmaps_output = gmaps.geocode(target_name)
        location_output = gmaps_output[0].get("geometry")
        lat.append(location_output["location"]["lat"])
        lng.append(location_output["location"]["lng"])
        # location_output = gmaps_output[0]

    else:
        lat.append(np.nan)
        lng.append(np.nan)

지도에 시각화하기

  • location
mapping = folium.Map(location=[41.8781136, -87.6297982], zoom_start=11)
for idx, row in df.iterrows():
    if not row["Address"] == "Multiple location":
        folium.Marker(
            location=[row["lat"], row["lng"]],
            popup=row["Cafe"],
            tooltip=row["Menu"],
            icon=folium.Icon(
                icon="coffee",
                prefix="fa"
            )
        ).add_to(mapping)
mapping

“이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.”

profile
데이터 공부 기록

0개의 댓글