[Python] ν¬λ‘€λ§(Crawling)
π λ€μ΄κ°λ©°
μ΄λ² κΈμμλ ν¬λ‘€λ§(Crawling)μΌλ‘ μΉ λ°μ΄ν°λ₯Ό μμ§νλ€. λ€μ λ΄μ€ ν€λλΌμΈκ³Ό λ‘λ λ²νΈλ₯Ό κ°μ Έμ λ°μ΄ν°νλ μμΌλ‘ λ§λ€κ³ μκ°νκΉμ§ ν΄λ³Έλ€.
ν¬λ‘€λ¬(crawler): μλνλ λ°©λ²μΌλ‘ μΉμ νμνλ νλ‘κ·Έλ¨. μΉμ νλ κ²μ΄ μΉ ν¬λ‘€λ§, κ·Έ λ°μ΄ν°λ₯Ό μμ§νλ κ²μ΄ λ°μ΄ν° ν¬λ‘€λ§μ΄λ€.
ν¬λ‘€λ§μ κΈ°λ³Έ νλ¦:
1
β URL μ μ β β‘ requests.get()μΌλ‘ μμ² β β’ BeautifulSoupμΌλ‘ HTML λ³ν β β£ select()λ‘ μνλ νκ·Έ μ λ³
1. λ΄μ€ ν€λλΌμΈ ν¬λ‘€λ§
1
2
3
4
5
6
7
8
# λ€μ λ΄μ€ νμ΄μ§ ν¬λ‘€λ§
url = 'https://news.daum.net/'
resp = requests.get(url) # β‘ μμ²
html = BeautifulSoup(resp.text, 'html.parser') # β’ HTML λ³ν
for news in html.select('a.link_txt')[:-13]: # β£ νκ·Έ μ λ³
print(news.text.strip().replace('[', '').replace(']', ''))
π‘ κ°λ°μ λͺ¨λλ‘ μνλ μμμ νκ·Έ(
a.link_txt)λ₯Ό νμΈν΄select()μ λ£λλ€..text.strip()μΌλ‘ ν μ€νΈλ§ μΆμΆνκ³.replace()λ‘ λΆνμν λ¬Έμλ₯Ό μ 리νλ€.
2. λ‘λ λ²νΈ ν¬λ‘€λ§ (1~30νμ°¨)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lotto_list = []
for i in range(1, 31):
print(f'{i}νμ°¨ ν¬λ‘€λ§ μ€μ
λλ€.')
# μ°¨λ¨ λ°©μ§ (λλ€ λλ μ΄)
seed = np.random.randint(100)
np.random.seed(seed)
time.sleep(np.random.randint(5))
url = f'https://search.daum.net/search?w=tot&DA=LOT&q={i}νμ°¨%λ‘λ'
resp = requests.get(url)
html = BeautifulSoup(resp.text, 'html.parser')
for ball_nm in html.select('span.ball')[:6]:
lotto_list.append(int(ball_nm.text))
print('ν¬λ‘€λ§ μλ£!!!')
β οΈ λ°λ³΅ μμ² μ μ°¨λ¨(block)μ νΌνκΈ° μν΄ λλ€ λλ μ΄(
time.sleep)λ₯Ό μ€λ€. λͺ¨λ λ²νΈλ₯Ό νλμ 리μ€νΈμ λ΄λ μ΄μ λ, μ΄νreshapeμΌλ‘ λ°μ΄ν°νλ μμ λ§λ€κΈ° μν¨μ΄λ€.
3. λ°μ΄ν°νλ μ λ³ν
1
2
3
4
lotto = np.array(lotto_list).reshape(-1, 6) # 6κ°μ© λ¬Άμ΄ νμ°¨λ³ νμΌλ‘
index_list = [f'{i}νμ°¨' for i in range(1, 31)]
df = pd.DataFrame(lotto, index=index_list)
df
π‘
reshape(-1, 6)μ βμ΄μ 6κ°λ‘ κ³ μ , νμ μλ κ³μ°βμ΄λΌλ λ». 리μ€νΈλ₯Ό νμ°¨λ³ 6κ° λ²νΈμ νλ‘ μ¬κ΅¬μ±νλ€.
4. μκ°ν
1
2
3
4
5
6
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
sns.countplot(lotto_list) # λ²νΈλ³ μΆν λΉλ
plt.show()
countplotμΌλ‘ κ° λ²νΈμ λΉμΆμ νμΈν μ μλ€.
π‘ λ²νΈλ³ νΈμ°¨κ° ν° κ²μ νλ³Έμ΄ 30νμ°¨λΏμ΄κΈ° λλ¬Έμ΄λ€. νμ°¨κ° κΈΈμ΄μ§μλ‘ ν΅κ³μ νλ₯ (κ· λ±)μ κ°κΉμμ§ κ²μ΄λ€.
π μ 리
1
2
3
4
5
6
ν¬λ‘€λ§ νλ¦
ββ μμ² requests.get(url)
ββ νμ± BeautifulSoup(resp.text, 'html.parser')
ββ μ λ³ html.select('νκ·Έ')
ββ μ°¨λ¨ λ°©μ§ time.sleep()μΌλ‘ λλ€ λλ μ΄
ββ κ°κ³΅/μκ°ν reshape β DataFrame β countplot
| λꡬ | μν |
|---|---|
| requests | URLμ λ°μ΄ν° μμ² |
| BeautifulSoup | HTML νμ± |
| select() | CSS μ νμλ‘ νκ·Έ μΆμΆ |
| reshape/DataFrame | μμ§ λ°μ΄ν°λ₯Ό νλ‘ |
ν¬λ‘€λ§μ βμμ² β νμ± β μ λ³βμ λ¨μν 3λ¨κ³ νλ¦μ΄λ€. μ¬κΈ°μ μ°¨λ¨ λ°©μ§(λλ μ΄)μ λ°μ΄ν° κ°κ³΅(DataFrame)μ λνλ©΄ μ€μ©μ μΈ λ°μ΄ν° μμ§ νμ΄νλΌμΈμ΄ μμ±λλ€.



Comments powered by Disqus.