항해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()
            })
        }

알게된 점

아직까진 할만하다.^^