항해99
특정 url 웹을 bs4로 크롤링하고 그것을 몽고디비에 저장하기
가문비7
2023. 3. 23. 23:17
문제점
제목의 과정이 잠깐 이해가 잘 되지 않았다.
시도해 본것
코드를 살펴보았다.
해결책
구조는 간단하다. 웹에서 url을 입력하고 '기록하기'를 누르면 function posting()이 실행된다. 그러면 입력한 url이 파이썬 서버로 가고 서버에서는 그 url을 bs4로 파싱해서 meta 태그들을 변수에 넣는다.
그 변수를 이용해 pymongo로 몽고디비에 집어넣는다.
해당 코드는 아래와 같다.
python
@app.route("/movie", methods=["POST"])
def movie_post():
url_receive = request.form['url_give']
comment_receive = request.form['comment_give']
star_receive = request.form['star_give']
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get(url_receive,headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
ogtitle = soup.select_one('meta[property="og:title"]')['content']
ogdesc = soup.select_one('meta[property="og:description"]')['content']
ogimage = soup.select_one('meta[property="og:image"]')['content']
doc = {
'title': ogtitle,
'desc': ogdesc,
'image': ogimage,
'comment': comment_receive,
'star': star_receive
};
db.movies.insert_one(doc)
return jsonify({'msg':'저장완료'})
Javascript
function posting() {
let url = $("#url").val(); // 클라이언트측에서 입력한 값
let comment = $("#comment").val();
let star = $("#star").val();
let formData = new FormData(); // 입력값들을 formData에 넣는다.
formData.append("url_give", url);
formData.append("comment_give", comment);
formData.append("star_give", star);
fetch('/movie', {method : "POST",body : formData}).then((res) => res.json()).then((data) => {
alert(data['msg']) // 표지(url?)가 /movie 이고 POST 방식인 API로 formData를 보낸다.
window.location.reload()
})
}
알게된 점
아직까진 할만하다.^^