다음 뉴스 랭킹 크롤링(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 값으로 클라이언트에 내려준다.
'Back > Python' 카테고리의 다른 글
Ajax 기본 및 예제 (1) | 2021.03.07 |
---|---|
Flask jinja2, requests - args 활용 예제 (0) | 2021.03.05 |
Python Flask, Ajax 활용 예제 - 링크 따오기 (1) | 2021.02.23 |
Python, Ajax 활용 예제 - 좋아요 기능 (1) | 2021.02.21 |
Flask에서 Ajax 요청하기 POST 예제 - 북리뷰(book-review) (0) | 2021.02.20 |