# 2022_07_22
# 2022_07_23
# 2022_07_29
# 2022_07_31
# 2022_08_05
# 2022_08_20
-
๋ค์ด๋ฒ ๋ด์ค ์ฃผ์๋ฅผ request๋ก ์์ฒญํ์์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ ์๋ฒ์์ ์ฌ์ฉ์ ์ํํธ์จ์ด์ ์๋ณ ์ ๋ณด์ธ User-Agent ์์ด HTTP ์์ฒญ์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ User-Agent ๊ฐ์ ํฌํจํ๋ header ์ถ๊ฐํ์ฌ ์ค๋ฅ ํด๊ฒฐ (ํฌ๋กฌ ์ฌ์ฉ)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} res = requests.get(URL, headers=headers)
ํด๋น ๋ ์ง์ ์ฒซ๋ฒ์งธ ํ์ด์ง URL๊ณผ ๊ทธ ํ์ด์ง ํ๋จ์ ํ์ด์ง ๋ฒํธ ๋ฆฌ์คํธ์ url์ page ๋ฆฌ์คํธ์ append
page = ['https://news.naver.com/main/list.naver?mode=LS2D&mid=shm&sid2=229&sid1=105&date=20220701'] for li in soup.select('#main_content > div.paging > a'): page.append('https://news.naver.com/main/list.naver' + li['href'])
page ๋ฆฌ์คํธ ์์ ํ์ด์ง์ ์๋ ๋ด์ค ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก for๋ฌธ์ผ๋ก ๋๋ฆฌ๋ 'ํ์ด์ง ํ์' for๋ฌธ ์ฌ์ฉ
for li in soup.select('#main_content > div > ul > li'): url = li.a['href']
๋ฆฌ์คํธ l์ 'ํ์ด์ง ํ์' for๋ฌธ์ผ๋ก ์ป์ title, date, contents ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฌถ์ด appendํ ํ for๋ฌธ ์ข ๋ฃ ํ pandas๋ฅผ ์ด์ฉํ์ฌ DataFrame์ผ๋ก ์ ๋ฆฌํ๊ณ ์์ (naver_news.xlsx)๋ก ์ ์ฅ
l.append([title, date, contents]) . . . df = pd.DataFrame(l, columns = ['title', 'url', 'contents']) df.to_excel('naver_news.xlsx', index = False)
-
6์ ํ ๋ฌ์ด 30์ผ์ธ๊ฑธ ๋ฐ์ํ์ฌ for, range๋ฌธ์ผ๋ก 30์ผ์น ๋ด์ค url์ ๋ง๋ค์ด day_url ๋ฆฌ์คํธ์ append
for day in range(30): day_url.append('https://news.naver.com/main/list.naver?mode=LS2D&mid=shm&sid2=229&sid1=105&date='+ str(20220601 + day))
-
๊ธฐ์กด์๋ ๋ด์ค ๊ฐ๋ณ ํ์ด์ง ์์์ title๊ณผ date๋ฅผ ์์ง ์ด ๊ณผ์ ์์ ์ธ๋ก ์ฌ๋ง๋ค selector๊ฐ ๋ฌ๋ผ์ ๊ทธ ์ข ๋ฅ๋ฅผ ๋ชจ๋ ์ฐพ์ ํ try, except๋ฌธ์ผ๋ก ์ฒ๋ฆฌ (2022_08_05 ์ฐธ๊ณ )
#title try : title = soup.select_one('#ct > div > div > h2').text.strip() except: title = soup.select_one('#content > div > div > div > div > h4').text.strip() #date try: date = soup.select_one('#ct > div > div > div > div > span').text.strip() except: date = soup.select_one('#content > div > div> div > div> div > span').text.strip() if date == '์๋ก์ด ๋ด์ค': date = soup.select_one('#content > div.end_ct > div > div.article_info > span > em').text.strip() else: list(date) date = date[5:] str(date)
์์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋ ๋ง์ ๋ด์ค ๊ธฐ์ฌ๋ฅผ ์์งํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ณ ํจ์จ์ ์ด์ง ๋ชปํ๊ธฐ์ ๋ด์ค ๊ฐ๋ณ ํ์ด์ง๊ฐ ์๋ ๋ด์ค ๋ฆฌ์คํธ๊ฐ ๋ณด์ด๋ ํ์ด์ง์์ ๊ธฐ๋ณธ ์ ๋ณด๋ฅผ ์์งํ๋๋ก ์์ (๊ทธ๋ฌ๋ ํ์ด์ง ๋ด๋ถ์์ ์์งํ๋ contents ํญ๋ชฉ์ ์์ง ์์ ํ์ง ๋ชปํจ)
def basic_info(li): url = li.a['href'] for t in li.select('#main_content > div > ul > li > dl > dt > a'): title = t.text.strip() date = li.select_one('#main_content > div > ul > li > dl > dd > span.date').text.strip() return title, date, url
-
์์ ์ ํ์ ํ๊ณ๋ 1048576๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐฉ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ์ ๋ฌด๋ฆฌ๊ฐ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉ MySQL์ web ์คํค๋ง๋ฅผ ์์ฑ, news ํ ์ด๋ธ ์์ฑ, publisher, title, date ํ๋ ์์ฑ
CREATE DATABASE web USE web CREATE TABLE `test`.`news` ( `publisher` VARCHAR(20) NOT NULL, `title` VARCHAR(100) NOT NULL, `date` VARCHAR(30) NOT NULL);
python์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ์ฌ pymysql ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ
pip install PyMySQL
MySQL์ ์ฐ๊ฒฐํ ๋ ํ์ํ db, host, user, password, port, charset ์ ๋ณด๋ฅผ ๋์ ๋๋ฆฌํ์ผ๋ก mysql_user_info.py๋ก ๋ฏธ๋ฆฌ ์ ์ฅํ์๋ค๊ฐ naver_news_detail.py์์ import ํ์ฌ ์ฌ์ฉ
# mysql_user_info.py user_info = {'db' : 'web', 'host' : '127.0.0.1', 'user' : 'root', 'passwd' : 'DB_PASSWORD', 'port' : 3306, 'charset' : 'utf8'}
import mysql_user_info
with as๋ฌธ์ ์ด์ฉํ์ฌ close()๋ฌธ์ ์ฌ์ฉํ์ง ์์๋ ๋จ
def insert_data(publisher, title, date): user = mysql_user_info.user_info db = pymysql.connect(db=user['db'], host=user['host'], user=user['user'], passwd=user['passwd'], port=user['port'], charset=user['charset']) sql = 'INSERT INTO news (publisher, title, date) VALUES (%s, %s, %s)' with db: with db.cursor() as cursor: cursor.execute(sql, (publisher, title, date)) db.commit()
time ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์ฝ๋ ์คํ์๊ฐ ์ธก์ (6์ ํ ๋ฌ์น๋ฅผ contents๋ฅผ ํจ๊ป ์์งํ๋ฉด ์ฝ 10๋ถ ์ ๋ ์์, contents๋ฅผ ์์ง ์ํ์์ ๋ 68.97558355331421์ด ์์)
import time start_time = time.time() . . . print(f'Time : {time.time() - start_time}')
-
2021๋ 1๋ ์น ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ธฐ ์ํ์ฌ 1๋ ์น ๋งํฌ๋ฅผ day_url ๋ฆฌ์คํธ์ append
# ๋ ์ง ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ month_day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] day_url = [] for month in range(12): for day in range(month_day[month]): day_url.append(('https://news.naver.com/main/list.naver?mode=LS2D&mid=shm&sid2=229&sid1=105&date=' + str(20210000 + (month + 1) * 100 + (day + 1))))
2022_07_29 ์ ์์ ํ์ง ๋ชปํ์๋ contents ํญ๋ชฉ ๋ฐ์ดํฐ ์์ง ๋ฐฉ์ ๋ณ๊ฒฝ
์ธ๋ก ์ฌ๋ง๋ค selector๊ฐ ๋ค๋ฅธ ๊ฒ์ด ์๋ ๋ค์ด๋ฒ ๋ด์ค์ ์ผ๋ฐ ๋ด์ค, ์ฐ์ ๋ด์ค, ์คํฌ์ธ ๋ด์ค๋ง๋ค ๋ค๋ฅธ ๊ฒ์ ์ธ์งํ๊ณ ์์ # contents try: contents = soup.select_one('#dic_area').text.strip() except: if soup.select_one('#header > div > div > h1 > a:nth-of-type(2)').text == '์คํฌ์ธ ': contents = soup.select_one('#newsEndContents').text.strip() elif soup.select_one('#header > div > div > h1 > a:nth-of-type(2)').text == 'TV์ฐ์': contents = soup.select_one('#content > div.end_ct > div > div.end_body_wrp').text.strip()
ํน์ ๋ ์ง์ ํน์ ํ์ด์ง์์๋ง ๋ฐ์ดํฐ ์์ง์ด ์๋๋๊ฑธ ๋ฐ๊ฒฌ
ํ๋ฃจ๋์ ๊ณ ๋ฏผ ํ ๊ต์๋๊ป ์ง๋ฌธ์ ํ์๊ณ ์ ๋ ๋์์ ์ด์ฉํด์ ์์ ์ด ๊ฐ๋ฅํ๋ค๋ ๋ต๋ณ์ ์ป์
์ด๋ฒ์๋ ์ ๋ ๋์ ์์ด ์์งํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ธ ์ฒ๋ฆฌ ํ๋๋ก ์์ try: title, date, publisher, url = basic_info(li) contents = detail_info(url) print(f'Date : \n{date}') insert_data(publisher, title, date, contents) except: continue
-
์ฐ์ naver_news_detail.py๋ก db์ ์ ์ฅํ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ด
def fetch(): with pymysql.connect(db=user['db'], host=user['host'], user=user['user'], passwd=user['passwd'], port=user['port'], charset=user['charset']) as db: with db.cursor(pymysql.cursors.DictCursor) as cur: sql = 'SELECT * FROM news' cur.execute(sql) db.commit() data = cur.fetchall() return data
๋ถ์ํ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ db ์ค๊ณ๋ฅผ ๊ณ ๋ฏผํ๋ค๊ฐ | id | type | word | ๊ตฌ์กฐ๋ก ์ค๊ณ
id๋ 'publisher-date'๋ก ์ค์ # id ์์ฑ id = i['publisher'] + '-' + i['date']
์ ๋ชฉ์์๋ ๋ช ์ฌ๋ง, ๋ณธ๋ฌธ์์๋ ๋ช ์ฌ, ํ์ฉ์ฌ๋ง ์ถ์ถํ๊ณ ์ ํจ
๋ช ์ฌ๋ ์ด์ ์ ์ถ์ถํ์ฌ ๋ฃ์# ํํ์ ๋ถ์ title_pos = okt.pos(i['title']) title_noun = okt.phrases((i['title'])) body_pos = okt.pos(i['body']) body_noun = okt.phrases((i['body']))
๋ฐ์ดํฐ๋ฅผ ๋ ๊ฐ์ ํ ์ด๋ธ์ ๋ฃ์ง๋ง ํ๋์ ํจ์๋ก ์ฒ๋ฆฌ
# morpheme ํ ์ด๋ธ์ data ๋ฃ๊ธฐ def insert_data(id, type, word, sort): try: with pymysql.connect(db=user['db'], host=user['host'], user=user['user'], passwd=user['passwd'], port=user['port'], charset=user['charset']) as db: with db.cursor() as cursor: sql = 'INSERT INTO ' + sort + '_morpheme (id, type, word) VALUES (%s, %s, %s)' cursor.execute(sql, (id, type, word)) db.commit() except: pass