
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)
# 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 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_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
“이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.”