실습_3. API를 이용한 크롤링

Updated:

Daum 증권 페이지에서 주가 크롤링

  • 다음과 같은 방법으로 API url을 찾는다 api_network
import requests
import json

custom_header = {
    'referer' : 'http://http://finance.daum.net/quotes/A048410#home',
    'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'  }

def get_data() :
    result = []
    url = "http://finance.daum.net/api/search/ranks?limit=10" 
    # 상위 10개 기업의 정보를 얻는 API url을 작성
    req = requests.get(url, headers = custom_header)
    
    if req.status_code == requests.codes.ok:    
        print("접속 성공")
        # API에 접속에 성공하였을 때의 logic을 작성
        # JSON 데이터의 원하는 부분만 불러와 result에 저장
        
        # ========================================================
        stock_data = json.loads(req.text)
        # stock_data에 json파일을 json.loads해서 담아준다
        # ========================================================
        for i in stock_data['data']:
            result.append([i['rank'], i['name'], i['tradePrice']])
    else:
        print("접속 실패")
    
    return result

def main() :
    data = get_data()
    
    for d in data :
        print(d)
    
if __name__ == "__main__" :
    main()

네이버 실시간 검색어 크롤링

import requests
import json            #json import하기

#custom_header을 통해 아닌 것 처럼 위장하기
custom_header = {
    'referer' : 'https://www.naver.com/',
    'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'  }

def get_keyword_ranking() : 
    result = []
    url = "https://apis.naver.com/mobile_main/srchrank/srchrank?frm=main&ag=20s&gr=4&ma=-2&si=2&en=2&sp=-2"
    req = requests.get(url, headers = custom_header)
    
    if req.status_code == requests.codes.ok:
        print("접속 성공")
        
        stock_str = json.loads(req.text)
        for i in stock_str["data"]:
            result.append([i['keyword'],i['keyword_synonyms']])
    else:
        print("Error code")
    
    return result

def main() :
    result = get_keyword_ranking()
    i = 1
    for keyword, synonyms in result :
        if synonyms :
            print(f"{i}번째 검색어 : {keyword}, 연관검색어 : {synonyms}")
        else :
            print(f"{i}번째 검색어 : {keyword}")
        i += 1
    
if __name__ == "__main__" :
    main()

음식점 리뷰 크롤링

  • 원하는 음식점의 하이퍼링크를 찾아서 리뷰를 확인한다.
  • while 문을 사용해서 음식점이 가지고 있는 모든 리뷰를

from bs4 import BeautifulSoup
import requests
import json

custom_header = {
    'referer' : 'https://www.mangoplate.com',
    'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' }

def get_reviews(code) :
    comments = []
    
    i = 0
    while True :
        url = f"https://stage.mangoplate.com/api/v5{code}/reviews.json?language=kor&device_uuid=V3QHS15862342340433605ldDed&device_type=web&start_index={i}&request_count=5&sort_by=2"
        # 0으로 초기화 되어있는 start_index를 반복을 통해서 계속 받아와 준다
        req = requests.get(url, headers = custom_header)
        
        if req.status_code == requests.codes.ok:    
            print("접속 성공")
            stock_str = json.loads(req.text)
            
            if len(stock_str) == 0:
                break
            
            for re in stock_str:
                comments.append(re['comment']['comment'])
            
        else:
            print("Error code")
        i = i + 5
    
    return comments
   
def main() :
    href = "/restaurants/iMRRP69qtkeO"
    # 리뷰를 보고싶은 음식점의 하이퍼링크를 넣어준다
    print(get_reviews(href))
    
if __name__ == "__main__" :
    main()

음식점 href 크롤링

  • 검색후 해당 되는 음식점 href

from bs4 import BeautifulSoup
import requests
import json            #json import하기

custom_header = {
    'referer' : 'https://www.mangoplate.com/',
    'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' }


def get_restaurants(name) :
    # 검색어 name이 들어왔을 때 검색 결과로 나타나는 식당들을 리스트에 담아 반환
    
    restuarant_list = []
    
    url = "https://www.mangoplate.com/search/" + name
    
    req = requests.get(url, headers = custom_header)
    
    soup = BeautifulSoup(req.text, "html.parser")
    
    div = soup.find_all("div",class_="info")
    
    for re in div:
        href = re.find("a")['href']
        title = re.find("h2",class_="title").get_text().replace("\n","").replace("  ","")
        restuarant_list.append([href,title])
    
    return restuarant_list
    

def main() :
    name = input()
    
    restuarant_list = get_restaurants(name)
    
    print(restuarant_list)

if __name__ == "__main__" :
    main()

검색 결과 음식점 리뷰 크롤링

from bs4 import BeautifulSoup
import requests
import json            #json import하기

custom_header = {
    'referer' : 'https://www.mangoplate.com/',
    'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' }

def get_reviews(code) :
    comments = []
    
    url = f"https://stage.mangoplate.com/api/v5{code}/reviews.json?language=kor&device_uuid=V3QHS15862342340433605ldDed&device_type=web&start_index=0&request_count=5&sort_by=2"
    req = requests.get(url, headers = custom_header)
    
    if req.status_code == requests.codes.ok:
        result = []
        print("접속 성공")
        reviews = json.loads(req.text)
        for i in range(5):
            result.append(reviews[i]["comment"]["comment"][:20].replace("\n",""))
    else:
        print("Error code")
    # req에 데이터를 불러온 결과가 저장되어 있습니다.
    # JSON으로 저장된 데이터에서 댓글을 추출하여 comments에 저장하고 반환하세요.
    return result
    
    

def get_restaurants(name) :
    url = f"https://www.mangoplate.com/search/{name}"
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")
    
    # soup에는 특정 키워드로 검색한 결과의 HTML이 담겨 있습니다.
    result = []
    
    restaurants = soup.find_all("div",class_="info")
    
    # 특정 키워드와 관련된 음식점의 이름과 href를 튜플로 저장하고,
    for res in restaurants:
        name = res.find("h2",class_="title").get_text().replace("\n","").replace("  ","")
        a_tag = res.find("a")["href"]
        result.append((name,a_tag))
    # 이름과 href를 담은 튜플들이 담긴 리스트를 반환하세요.
    return result
    
def main() :
    name = input("검색어를 입력하세요 : ")
    
    restuarant_list = get_restaurants(name)
    
    for r in restuarant_list :
        print(r[0])
        print(get_reviews(r[1]))
        print("="*30)
        print("\n"*2)

if __name__ == "__main__" :
    main()

Leave a comment