์ด์ ํฌ์คํ ์์๋ requests์ selenium์ผ๋ก ํฌ๋กค๋งํ๋ ๋ฒ์ ๋ํด ์๊ฐ๋ฅผ ํ์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ requests-html์ ํ์ฉํ์ฌ ์ฃผ์ ์ข ๋ชฉ ๋ด์ค ๋ฐ์ดํฐ๋ฅผ ์์งํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์ด๋ฒ ๋ด์ค ๊ฒ์
๋ค์ด๋ฒ ๊ฒ์์ฐฝ์ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ ๋ค, ๋ด์คํญ์ผ๋ก ์ด๋ํ๋ฉด ์๋์ ๊ฐ์ ๊ฒ์ ์ต์ ๋ค์ด ๋ณด์ ๋๋ค.
์ฌํ ์ฌ์ดํธ์ ๊ฐ์ด URL ๋ถ๋ถ์ ๋ณด์๋ฉด ํน์ ํ ๊ตฌ์กฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค์ ์กฐ๊ฑด์ ๋ง๋ ๊ฒฐ๊ด๊ฐ์ ๋ ธ์ถํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค:
https://search.naver.com/search.naver?where=news&query=ํ์ด๋ธ&sm=tab_opt&sort=0&photo=0&field=0&pd=0&ds=&de=&docid=&related=0&mynews=0
&office_type=0&office_section_code=0&news_office_checked=&nso=so% 3Ar% 2Cp%3 Aall
&is_sug_officeid=0
์ง์ ํํฐ ์กฐ๊ฑด์ ๊ฑธ์ด๊ฐ๋ฉด์ URL์ด ๋ณํํ๋ ๊ฒ์ ๋ณด๋ฉด์ ๊ฐ๊ฐ์ ํ๋ผ๋ฏธํฐ๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ํ์ธ์ ํ์ต๋๋ค:
- &query= > ๊ฒ์์ด๊ฐ ๋ค์ด๊ฐ๋ ์๋ฆฌ
- &sort=0 > ์ด๋ป๊ฒ ์ ๋ ฌ์ ํ ์ง ์ ํ๋ ๋ถ๋ถ (0์ ๊ด๋ จ๋ ์)
- &photo=0 > ๋ด์ค ์ ํ์ ์ค์ ํ ์ ์๋ ๋ถ๋ถ (0์ ์ ์ฒด)
- &pd=0 > ๋ด์ค ๊ธฐ๊ฐ์ ์ ํ ์ ์๋ ๋ถ๋ถ (0์ ์ ์ฒด)
- &ds=&de= > ๋ด์ค ๊ธฐ๊ฐ์ด ์ง์ ์ ๋ ฅ์ผ ๋ (&pd=3) ์์์ผ์(&ds=)์ ์ข ๋ฃ์ผ์(&de=)๋ฅผ ์ ํ๋ ๋ถ๋ถ (yyyy.mm.dd ํ์)
- &start= > ๋ด์ค ๊ฒ์๊ฒฐ๊ณผ ํ์ด์ง ๋ฒํธ๋ฅผ ์ง์ ํ๋ ๋ถ๋ถ์ด๋ฉฐ ์ต๋ 400๊น์ง ์กด์ฌ (๋ค์ด๋ฒ ๋ด์ค ๊ฒ์๊ฒฐ๊ณผ๋ ์ต๋ 4,000๊ฑด)
์ด๋ ๊ฒ ์ฐพ์ ๋ด์ฉ์ ๋์ ๋๋ฆฌ๋ก ์ ์ฅ์ ํ์ต๋๋ค. ์์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก 2022.12.25 ~ 2022.12.31 ๊ธฐ๊ฐ ๋์ ํ์ด๋ธ ๊ด๋ จ ๋ด์ค ์ง๋ฉด๊ธฐ์ฌ์ ๋งํฌ๋ฅผ ์์งํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ค์ฝ๋
from requests_html import HTMLSession
# HTML ์ธ์
session = HTMLSession()
# ๋ค์ด๋ฒ ๋ด์ค ํํฐ ์ฌ์
sort_dict = {'๊ด๋ จ๋์':'0', '์ต์ ์':'1', '์ค๋๋์':'2'}
type_dict = {'์ ์ฒด':'0', 'ํฌํ ':'1', '๋์์':'2'
, '์ง๋ฉด๊ธฐ์ฌ':'3', '๋ณด๋์๋ฃ':'4', '์๋์์ฑ๊ธฐ์ฌ':'5'}
period = {'์ ์ฒด' : '0'
, '1์๊ฐ' : '7', '2์๊ฐ' : '8', '3์๊ฐ' : '9'
, '4์๊ฐ' : '10', '5์๊ฐ' : '11', '6์๊ฐ' : '12'
, '1์ฃผ' : '1', '1๊ฐ์': '2', '3๊ฐ์': '13'
, '6๊ฐ์': '6', '1๋
' : '5', '์ง์ ์
๋ ฅ': '3'}
# ์กฐ๊ฑด์ ๋ง๋ ๊ฒ์ ํ๋ผ๋ฏธํฐ ์ค์
stock_nm = 'ํ์ด๋ธ'
sort = '๊ด๋ จ๋์'
article_type = '์ ์ฒด'
prd = '์ง์ ์
๋ ฅ'
start_dt = '2022.12.25' if prd=='์ง์ ์
๋ ฅ' else ''
end_dt = '2022.12.31' if prd=='์ง์ ์
๋ ฅ' else ''
# URL ์์ฑ
base_url = 'https://search.naver.com/search.naver?where=news&query='
url_elements = [base_url, stock_nm, '&sm=tab_opt&sort=', sort_dict[sort], '&photo=', type_dict[article_type]
, '&pd=', period[prd], '&ds=', start_dt, '&de=', end_dt]
url = ''.join(url_elements)
# Requests-url๋ก HTML ์นํฌ๋กค๋ง ์งํ
news_links = []
for i in range(0,400): # ๋ค์ด๋ฒ๋ ์ต๋ 4000๊ฑด ๊น์ง ์ ๊ณต์ ํ๋ฏ๋ก, 400ํ์ด์ง๊ฐ max
# URL์ ํ์ด์ง ๋ฒํธ ์ถ๊ฐ
url += f'&start={i}1'
## ์ธ์
๋ถ๋ฌ์ค๊ธฐ
r = session.get(url)
## ๊ฒ์๊ฒฐ๊ณผ ๋ถ๋ถ์ ์๋ ๋ด์ค๋งํฌ ๊ฐ์ ธ์ค๊ธฐ
links = r.html.find('#main_pack > section > div > div.group_news')[0].absolute_links
## ๋ด์ค๊ฐ ์๋ ๋ค๋ฅธ ๋งํฌ๋ค์ ํจํด์ ํ์ฉํ์ฌ ์ ๊ฑฐ
valid_links = [l for l in links if not l.endswith(('.co.kr','/','.com')) and not l.startswith('https://search.naver.com/?')]
## ๋ฐ์ดํฐ ์ ์ฅ
news_links.extend(valid_links)
# ์ค๋ณต ๋งํฌ ๊ฐ๋ฅ์ฑ ์ ๊ฑฐ
news_links = list(set(news_links))
len(news_links)
446
446๊ฑด์ ๋ด์ค ๊ธฐ์ฌ๊ฐ ์์ง๋์์ต๋๋ค.
์๋ ๊ฒ์๊ฒฐ๊ณผ ์์ผ๋ก ํ์ด์ง ๋ฒํธ๋ 33๊น์ง ๋ฐ์ ์์ง๋ง, ๋ด์ค๊ธฐ์ฌ๊ฐ 446๊ฑด์ด๋ ๋์จ ์ด์ ๋ ๊ด๋ จ ๋ด์ค ๊ธฐ์ฌ๊น์ง ๊ฐ์ด ์์ง์ด ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ ์ฐ์ธก ์คํฌ๋ฆฐ์ท์ ํ์๋ ๊ด๋ จ๋ด์ค 11๊ฑด๊ณผ 26๊ฑด ๋ชจ๋ 446๊ฑด์ ํฌํจ์ด ๋์ด ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ๋ค์ด๋ฒ ๊ฒ์ ํํฐ์ requests-html์ ํ์ฉํ์ฌ ์ํ๋ ์กฐ๊ฑด์ ๋ด์ค์ ๋งํฌ๋ฅผ ์์งํ๋ ๋ฒ์ ๋ํด ๋ค๋ค์ต๋๋ค. ์ดํ ํฌ์คํ ์์๋ ์์งํ URL๋ก ๋ด์ค ์ ๋ชฉ, ๊ธฐ์ฌ ๋ฑ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ์ ์ฅํ๋ ๊ฒ ๊น์ง ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.
'๐ป ITยท๊ธฐ์ ยทํต๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[API] ChatGPT Python์ผ๋ก ์ฌ์ฉํด๋ณด๊ธฐ - Part.2 (0) | 2023.03.08 |
---|---|
[NLP] lexrankr๋ก 3์ค ์์ฝํด๋ณด๊ธฐ (0) | 2023.02.15 |
Image to Textโฆ? ์ด๋ฏธ์ง๋ก ์์คํค ์ํธ ์์ฑํ๊ธฐ (2) | 2023.02.11 |
[Snippet] ์์ฃผ ์ฌ์ฉํ๋ List, Dictionary ๊ธฐ๋ฅ (0) | 2023.02.09 |
[API] ์ธ๊ณ ๊ฐ๊ตญ์ ๊ธฐ๋ณธ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ (restcountries) (2) | 2023.02.06 |
๋๊ธ