네이버 연관 검색어 수집

P4·2023년 5월 24일
0
post-thumbnail

네이버 연관 검색어 수집

  • 정적(static) 웹페이지 데이터 수집
  • BeautifulSoup을 이용하여 HTML 문자열 데이터 parsing

라이브러리 임포트

import pandas as pd
import requests
from bs4 import BeautifulSoup

1. 웹페이지 분석 : URL

query = "삼성전자"
url = f"https://search.naver.com/search.naver?query={query}"
print(url)

2. request(URL) > response : str(html)

response = requests.get(url)
response # 200이 뜨는지 확인
response.text[:250] # 텍스트를 제대로 가져왔는지 확인

3. str(html) > bs object

  • html 문자열을 beautifulSoup Object로 변환한다.
dom = BeautifulSoup(response.text, "html.parser")
print(type(dom))

4. bs object > .select(css-selector), .select_one(css-selector) > str(text)


  • bs object에서 css-selector를 이용해 원하는 태그안의 내용을 가져온다.
Tag선택방법
element Tag (<div>, <p>...)soup.select('p')
id값#id
class값.class
attr값 (<p value="no1">, <p value="no2">...)p[value="no1"]

  • 예시코드
from bs4 import BeautifulSoup

html = '''
<html>
<body>
    <div class="container">
        <h1 id="test_title">Title</h1>
        <span class="test_span">spanspanspan</span>
        <p value="no1">Paragraph 1</p>
        <p value="no2">Paragraph 2</p>
    </div>
</body>
</html>
'''

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

# element tag + attribute로 선택
paragraphs1 = soup.select('div > p[value="no1"]')

# element tag + class로 선택
paragraphs2 = soup.select('div > .test_span')

# element tag + id로 선택
paragraphs3 = soup.select('div > #test_title')

# 출력

for p in paragraphs1:
    print(p.text)
    
for p in paragraphs2:
    print(p.text)

for p in paragraphs3:
    print(p.text)

  • class값으로 검색
# 10개의 엘리먼트들 선택
# select() : list(Tag, Tag)
# select_one() : Tag
elements = dom.select(".lst_related_srch > .item")
print(len(elements))

  • elements의 요소중 맨앞만 뽑아서 확인
element = elements[0]
keyword = element.select_one(".tit").text
print(keyword)

  • element의 a태그안의 href 속성값 가져오기
link = element.select_one("a").get("href")
print(link)

  • 각각의 엘리먼트에서 text 데이터 수집
keywords = []
for element in elements:
    keyword = element.text.strip() # 문자열 앞뒤 공백 제거
    keywords.append(keyword)
print(keywords)

# list comprehension을 사용하면 다음과 같다
# keywords = [element.text.strip() for element in elements]
# print(keywords)

5. str(text) > DataFrame

  • 검색어 : query, 연관검색어 : keywords 로 DataFrame 생성
df = pd.DataFrame({"keywors": keywords})
df["query"] = query
df.tail(2)

  • 현재 시간 데이터 추가
from datetime import datetime
now = datetime.now()
now = now.strftime("%Y-%m-%d %H:%M") # now는 현재시각 (분까지)을 담음

df["date_time"] = now
display(df.tail(2))

6. 함수화

  • query를 입력하면 데이터 프레임을 출력하는 함수
def naver_relate_keyword(query):
    
    url = f"https://search.naver.com/search.naver?query={query}"
    response = requests.get(url)
    dom = BeautifulSoup(response.text, "html.parser")
    elements = dom.select(".lst_related_srch > .item")
    keywords = [element.text.strip() for element in elements]
    
    df = pd.DataFrame({"keywors": keywords})
    df["query"] = query
    
    now = datetime.now()
    now = now.strftime("%Y-%m-%d %H:%M")
    df["date_time"] = now
    
    return df

  • 사용예시
query = "삼성전자"
df = naver_relate_keyword(query)
display(df.tail(2))

  • 출력
keywordsquerydata_time
삼성전자서비스삼성전자2022-07-10 22:06
삼성전자 as센터삼성전자2022-07-10 22:06

  • concat
dfs = []
queries = ["삼성전자", "LG전자"]

for query in queries:
    print(query, end=" ")
    df = naver_relate_keyword(query)
    dfs.append(df)
    
result = pd.concat(dfs, ignore_index=True)
display(result)
profile
지식을 담습니다.

0개의 댓글