Spicy Tuna Sushi
본문 바로가기
정보

BeautifulSoup로 이미지 저장하기

by 말린malin 2022. 9. 24.

챗봇에서 맛집 정보를 반환할 때, 음식 사진도 함께 보여주어야 한다.

DB에서 갖고 있는 엔티티는 Tag, FoodType, Location, Name, Phone였는데, Image도 추가해서 넣으려고 한다.

음식점 Name을 갖고 와서, 식신이라는 홈페이지에서 검색해서 나오는 이미지를 저장한다.

 

https://www.siksinhot.com/

 

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

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

www.siksinhot.com

 

원래 갖고 있는 csv 파일에 이미지 링크만 저장해둔 새로운 csv 파일을 병합하는 방식으로 코드를 짰는데, 왠지 더 효율적인 방법이 있을 것 같다. 

원래 파일에서 row['Name']을 읽어 이미지 링크를 그때그때 추가해 준다면, 반복문을 한 번만 돌려도 되지 않을까? 그런데 그렇게 바로 추가할 수 있는 방법을 모르겠어서 일단은 따로 만들어서 병합하는 방식으로 했다.

 

import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd

#원본 파일에서 음식점 이름 names 리스트에 저장
with open('배리어프리 음식점.csv','r',encoding='UTF8') as f:
    reader=csv.DictReader(f)
    names=[]
    for row in reader:
        names.append(row['Name'])

#식신 사이트 링크
url='https://www.siksinhot.com/search?keywords='

#결과 파일 만들기
with open('배리어프리 음식점_이미지.csv','w',encoding='UTF8',newline='') as f1:
    fieldnames=['Image']
    writer=csv.DictWriter(f1,fieldnames=fieldnames)
    writer.writeheader()

    res={}

    #웹크롤링
    for name in names:
        link=url+f'{name}'
        response=requests.get(link)
        soup=BeautifulSoup(response.text,'html.parser')

        #copy selector
        select=soup.select('#schMove1 > div.listTy1 > ul > li:nth-child(1) > div > a > span > img')

        #예외처리
        try:
            res['Image']=select[0]['src']
        except:
            res['Image']=''

        writer.writerow(res)

f.close()
f1.close()

a='배리어프리 음식점.csv'
b='배리어프리 음식점_이미지.csv'
dataFrame = pd.concat(map(pd.read_csv, [a,b]), axis=1)

#병합 후 최종 파일
output_file = r'배리어프리 음식점_최종.csv'
dataFrame.to_csv(output_file)

 

 DB에는 이런식으로 저장!

댓글