가취공부하자

BeautifulSoup, 웹 스크래핑 본문

Python/(책)파이썬과 비지니스 자동화

BeautifulSoup, 웹 스크래핑

keepGGoing 2022. 7. 21. 00:11

https://www.siksinhot.com/

 

식신 : 대한민국 No.1 맛집검색,맛집추천

전국부터 해외까지 없는 맛집이 없는 No.1 맛집 정보 & 추천 서비스 국민맛집 식신!

www.siksinhot.com

오늘 실습의 목표는 '식신'사이트에서 강남을 검색해 상위 10개 맛집에 대한 정보를 추출하는 것이다.

 

실습 순서는

1. 식신 페이지의 HTML 요소를 읽어온다.

2. 강남 상위 10개 맛집 url 링크를 추출한다.

3. 해당 링크에서 맛집 이름, 주소, 전화번호 정보를 추출한다.

 

첫 번째, 식신 페이지의 Html요소를 읽어오기

from bs4 import BeautifulSoup
from threading import Thread
import urllib.request
from urllib.parse import quote

#해당 페이지의 html 요소 읽어온다.
home_url = 'https://www.siksinhot.com/'
keywords = quote('강남')

search_url = 'https://www.siksinhot.com/search?keywords='+ keywords
s_html = urllib.request.urlopen(search_url).read()
s_soup = BeautifulSoup(s_html,'lxml')
더보기

코드 작성하면서 마주한 에러.. 'ascii' codec can't encode characters in position 21-22: ordinal not in range(128)
keywords= '강남'  

해결 : keywords = quote('강남')

 

두 번째, 강남 상위 10개 맛집 url 추출.

식신에서 '강남'을 검색했을 때 나오는 페이지의 HTML이다.

우리가 얻어야 하는 정보는

<div class='listTy1' ~>

<ul>

<a href='/p/12213'>

으로 타고 들어가 href에 있는 정보를 얻어야 한다. ul까지가 공통 태그이고 a에 원하는 정보가 들어있다.

from bs4 import BeautifulSoup
from threading import Thread
import urllib.request
from urllib.parse import quote

#해당 페이지의 html 요소 읽어온다.
home_url = 'https://www.siksinhot.com/'
keywords = #quote('강남')

search_url = 'https://www.siksinhot.com/search?keywords='+ keywords
s_html = urllib.request.urlopen(search_url).read()
s_soup = BeautifulSoup(s_html,'lxml')

#강남 상위 10개 맛집 url 추출
s_urls = s_soup.select('div.listTy1 ul div.cont a')[:10]

urls =[]
for u in range(len(s_urls)):
    urls.append(home_url + s_urls[u]['href'])
    print(urls[u])

 

세 번째, 추출한 링크로 들어가 맛집의 이름, 주소, 전화번호를 추출.

주황색 - 주소, 초록색 -전화번호 정보를 추출하기 위해 봐야 하는 태그

from bs4 import BeautifulSoup
from threading import Thread
import urllib.request
from urllib.parse import quote

#해당 페이지의 html 요소 읽어온다.
home_url = 'https://www.siksinhot.com/'
keywords = #quote('강남')

search_url = 'https://www.siksinhot.com/search?keywords='+ keywords
s_html = urllib.request.urlopen(search_url).read()
s_soup = BeautifulSoup(s_html,'lxml')

#강남 상위 10개 맛집 url 추출
s_urls = s_soup.select('div.listTy1 ul div.cont a')[:10]

urls =[]
for u in range(len(s_urls)):
    urls.append(home_url + s_urls[u]['href'])
    print(urls[u])

#스크래핑 작업
def scrape(url:str):
    html = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(html, 'lxml')

    #얻을 정보 : 식당이름, 주소, 전화번호
    title = soup.select('div.store_name_score h3')
    print('Title : ', title[0].getText())
    address = soup.select('div.store_info span')
    print('Address : ', address[0].getText())
    phone = soup.select('div.p_tel p')
    print('Phone :', phone[0].getText())

    print('----------------')

thread_list = []
for url in urls:
    t =Thread(target=scrape, args=(url,))
    t.start()
    thread_list.append(t)

for t in thread_list:
    t.join()

+ 속도를 더 빠르게 하기 위해서 Thread를 사용하였다.

<참조>

http://www.acornpub.co.kr/book/automate-it (파이썬 비즈니스 자동화, 에이콘출판사, 2018)

 

파이썬과 비즈니스 자동화

파이썬 2.7로 비즈니스 자동화를 위한 필요한 기술을 다루고, 실제로 활용할 수 있도록 도와준다

www.acornpub.co.kr