Back/Python

다음 뉴스 랭킹 크롤링(Crawling) 예제

다음 뉴스 랭킹 크롤링(Crawling) 예제

@app.route('/api2/list', methods=['GET'])
def show_news2():
    db.finalPrac2.remove({ });

    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('https://news.daum.net/', headers=headers)

    soup = BeautifulSoup(data.text, 'html.parser')

    trs = soup.select("#cSub > div > ul > li")
    # cSub > div > ul > li:nth-child(1) > div.item_issue > div > strong > a
    # cSub > div > ul > li:nth-child(1) > div.item_issue > a > img
    # cSub > div > ul > li:nth-child(1) > div.item_issue > div > span
    # cSub > div > ul > li:nth-child(1) > div.item_issue > div > strong > a

    for tr in trs:
        title = tr.select_one(r'div.item_issue > div > strong > a').text
        url = tr.select_one(r'div.item_issue > div > strong > a')['href']
        img = tr.select_one('div.item_issue > a > img')['src']
        newspaper = tr.select_one('div.item_issue > div > span').text

        title = title.replace('"', '').replace('…', '')

        doc = {
            "title": title,
            "img":img,
            "url": url,
            "newspaper": newspaper,
        }
        db.finalPrac2.insert_one(doc)


    news_show2 = list(db.finalPrac2.find({}, {'_id': False}))
    return jsonify({'news_give2': news_show2})

클라이언트에서 /api2/list의 값을 가진 url에서 GET 요청을 해오면

 

db에 있는 값을 제거 해주고, (이 부분은 임시방편으로 그냥 제거했다.. 계속 크롤링 해올 것 같아서)

 

bs4를 이용하여 trs의 값을 정해준다.

 

li:nth-child(1) 이 공통된 부분인걸 확인 하고,

li까지만 작성하여 trs의 변수를 정해준다.

 

그 후 for문을 돌린다.

 

뒤에 있는 title은 replace를 이용하여 " 와 ' 을 제거해줬다.

(이 부분은 " " 가 있으니 title값을 제대로 못 가져와서 임시 방편으로 했다)

 

doc란 딕셔너리를 만들고,

 

db값에 저장해준다.

 

그 후 모든 리스트를 news_give2 값으로 클라이언트에 내려준다.