27번째 EDA 3. 웹데이터 스터디노트

이망치·2023년 5월 16일
0

EDA 실습

목록 보기
7/11
post-thumbnail

시카고 맛집 데이터 분석

프로젝트 개요

총 51개 페이지에서 각 가게의 정보를 가져온다

  • 가게이름
  • 대표메뉴
  • 대표메뉴의 가격
  • 가게주소

시카고 맛집 메인페이지 분석

메인페이지의 html을 불러와 메인화면에 있는 맛집 이름, 메뉴, 랭킹, url을 찾아 데이터프레임 생성

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

url_base = "https://www.chicagomag.com/"
url_sub = "Chicago-Magazine/November-2012/Best-Sandwiches-Chicago/"
url = url_base + url_sub  
ua = UserAgent()
req = Request(url, headers={"user-agent": ua.ie})
html = urlopen(req)
soup = BeautifulSoup(html, "html.parser")

import re 
tmp_string = tmp_one.find(class_="sammyListing").get_text()
re.split(("\n|\r\n"), tmp_string)

from urllib.parse import urljoin 

url_base = "http://www.chicagomag.com"

# 필요한 내용을 담을 빈 리스트 
# 리스트로 하나씩 컬럼을 만들고, DataFrame으로 합칠 예정 
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_string = item.find(class_="sammyListing").get_text() 
    main_menu.append(re.split(("\n|\r\n"), tmp_string)[0])
    cafe_name.append(re.split(("\n|\r\n"), tmp_string)[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)

시카고 맛집 하위페이지 분석

메인페이지에 있는 각 맛집의 url(하위페이지)에 각각 들어가 가격과 주소를 받아와 만들어둔 데이터프레임에 추가한다.

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

from tqdm import tqdm 

price = [] 
address = [] 

for idx, row in tqdm(df[:5].iterrows()):
    req = Request(row["URL"], headers={"user-agent":ua.ie})
    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:])
    
df["Price"] = price 
df["Address"] = address
df = df.loc[:, ["Rank", "Cafe", "Menu", "Price", "Address"]]
df.set_index("Rank", inplace=True)

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

google_maps를 이용해 가게 주소의 위도, 경도를 찾아 데이터프레임에 추가하고 folium을 이용하여 지도시각화한다.

import folium
import pandas as pd 
import numpy as np 
import googlemaps
from tqdm import tqdm 

gmaps_key = ""
gmaps = googlemaps.Client(key=gmaps_key)

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_ouput = gmaps_output[0].get("geometry")
        lat.append(location_ouput["location"]["lat"])
        lng.append(location_ouput["location"]["lng"])
        # location_output = gmaps_output[0]
    else:
        lat.append(np.nan)
        lng.append(np.nan)
        
df["lat"] = lat 
df["lng"] = lng 

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

다움 영화 평점 분석

다움의 영화페이지에서 영화의 이름과 평점의 정보를 가져와보자

업로드중..

import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = "https://movie.daum.net/ranking/reservation"
response = urlopen(url)
soup = BeautifulSoup(response, "html.parser")

# 영화 제목 태그
soup.find_all("strong","tit_item")[0].text.strip()
# 영화 평점 태그
soup.find_all("span","txt_grade")[0].text

# 영화 제목 리스트

end= len(soup.find_all("strong","tit_item"))

movie_name = []

for n in range(0,end):
    name= soup.find_all("strong","tit_item")[n].text.strip()
    movie_name.append(name)

# 반복문 다른방식
movie_point = [soup.find_all("span","txt_grade")[n].text.strip() for n in range(0,end)]

movie = pd.DataFrame({"movie_name":movie_name, "movie_point":movie_point})

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

profile
데이터 공부합니다

0개의 댓글