목적

- https://www.data.go.kr/ 에서 제공하는 분양권 데이터를 요청시마다 실시간으로 수신

- '국토교통부_아파트매매 실거래 상세 자료' 에 해당한느 API

 

 

1. 라이브러리 Import

# 1-1. 데이터 가져오기
import requests
import datetime
import json
import xmltodict
import pandas as pd 
from pandas import json_normalize
from sqlalchemy import create_engine
import pymysql
import pandas as pd
import numpy as np
import time
import datetime
import pytz
from datetime import datetime

 

 

2. API의 url 과 발급받은 service key 정의

url ="http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcSilvTrade?"
service_key = "Data.go.kr에서 신청해서 받은Key"

 

3. 입수일자와 시각을 알기위한 변수정의

- 프로그램 수행시 현재일자, 현재시각을 가지고옴

- base_dt 는 현재 수행되는 기준의 년월을 가지고옴 ex) 2023-02-06 수행시 2023-02 

- base_dt로 수행월에 발생한 데이터를 가지고옴

#  기준일자, 기준시각 추가
now = datetime.now(pytz.timezone('Asia/Seoul'))
nowDate = now.strftime('%Y%m%d')
nowTime = now.strftime('%H%M')

base_dt = nowDate[:6]

 

 

4. 행정동 Code를 df1에 미리 셋업해놓음

 

 

 

5. 크롤링 Main 부분

- XML형태이므로 각각 구조에 따라 파싱

- 현재까지 크롤링 기준으로 예외사항에 대해 각각 예외처리 하였으나, 추가로 발견시에는 코멘트 요망

for lawd_cd in df1['LAWD_CD']:
    payload = "LAWD_CD=" + lawd_cd + "&" + \
              "DEAL_YMD=" + base_dt + "&" + \
              "serviceKey=" + service_key + "&" 

    response = requests.get(url + payload) 

    res_json = xmltodict.parse(response.text) # 문자열을 XML을 JSON 형식으로 변환합니다.
    
    # 건수없으면 Skip 처리함.
    if(res_json['response']['body']['totalCount']!='0'):
        jsonString = json.dumps(res_json['response']['body']['items']['item'], ensure_ascii=False)      # 변환된 JSON 형식을 Dictionary 문자열로 변환합니다.
    else:
        print(lawd_cd,'건수없음')
        continue
        
        
    jsonObj = json.loads(jsonString) 
    if type(jsonObj) == list:
        df = pd.DataFrame.from_dict(jsonObj)
    else:
        #dict 반환후 전치시켜야 컬럼 읽기가능.
        df = pd.DataFrame.from_dict(jsonObj,orient='index').T
    
    if firstyn == 'Y':
        df2 = pd.DataFrame(index=range(0,0), columns=df.columns)
        firstyn = 'N'
        
    df2 = df2.append(df,ignore_index=True)
    time.sleep(1)
    print(type(jsonObj), lawd_cd)
    i=i+1

 

6. 분양권 실거래가 출력

반응형

목적

- 네이버 쇼핑의 '쇼핑몰리뷰'의 평점과 텍스트 크롤링

 

1. 필요사항 Import

- 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임

# step1.프로젝트에 필요한 패키지 불러오기
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd
import requests
import re
import numpy as np


from selenium.webdriver.common.keys import Keys

 

 

2. 크롬드라이버 설정 및 로그인 정보전달

header = {'User-Agent': ''}
d = webdriver.Chrome('C:/Users/XXXXXXXXX/Downloads/chromedriver.exe') # webdriver = chrome
shoppingmall_review="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[2]/div/div[2]/ul/li[4]/a/strong"

#함수 선언
def add_dataframe(dit,reviews,stars,cnt):  #데이터 프레임에 저장
    #데이터 프레임생성
    df1=pd.DataFrame(columns=['크롤링구분','리뷰','평점'])
    n=1
    if (cnt>0):
        for i in range(0,cnt-1):
            df1.loc[n]=[dit[i],reviews[i],stars[i]] #해당 행에 저장
            i+=1
            n+=1
    else:
        df1.loc[n]=['null','null','null']
        n+=1    
    return df1

 

3. 크롤링 대상 물품을 선정하고 URL로 정리 후 크롤링진행[Main]

**df2에 해당하는 데이터

- 실제 수집URL을 회사별로 관리하고 아래 for문에서 해당 df2를 순회하며 크롤링진행

- 파일로 담아놓아도 되고 DB Table형태로 관리해도 됨(개인적으로 Table형태를 선호함)

 

df1 = pd.DataFrame(columns=['크롤링구분','평점','리뷰'])
df4 = pd.DataFrame(columns=['크롤링구분','평점','리뷰'])

for dit,ns_address in zip(df2['크롤링구분'],df2['수집URL']):
    
    #print(name_, category_ ,ns_address, "\n")
    
    d.implicitly_wait(3)
    d.get(ns_address)
    req = requests.get(ns_address,verify=False)
    html = req.text 
    soup = BeautifulSoup(html, "html.parser")
    sleep(2)

    element=d.find_element_by_xpath(shoppingmall_review)
    d.execute_script("arguments[0].click();", element)
    sleep(2)

    # 리뷰 가져오기
    reviews=[]
    stars=[]
    total_list=[]
    cnt=1   #리뷰index
    page=1
       

    while True:
        
        j=1
        sleep(2)
        while True: #한페이지에 20개의 리뷰, 마지막 리뷰에서 error발생
            try:                              
                star=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li[1]/div[1]/span[1]').text
                star = star.replace("평점","")
                review=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li['+str(j)+']/div[2]/div[1]/p').text
                #reviews.append(review)
                total_list.append((dit,star,review))
                if j%2==0: #화면에 2개씩 보이도록 스크롤
                    ELEMENT = d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li['+str(j)+']/div[2]/div[1]/p')
                    d.execute_script("arguments[0].scrollIntoView(true);", ELEMENT)       
                j+=1
                cnt+=1 
            except: 
                break

        sleep(2)
        
        if page<11:#page10까지 적용
            try: #리뷰의 마지막 페이지에서 error발생
                page +=1
                next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a['+str(page)+']').click() 
            except: 
                break
        else :
            try: #page11부터
                page+=1
                if page%10==0: 
                    next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a[11]').click()
                elif page%10==1: 
                    next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a[12]').click()
                else : 
                    next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a['+str(page%10+1)+']').click()
            except: 
                break 

df4 = pd.DataFrame(total_list, columns=['크롤링구분','평점','리뷰'])
    #df4=add_dataframe(dit,reviews,stars,cnt)

 

 

4. Data Frame 출력결과

 
 

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

목적 - 감정분석을 위해 네이버 영화평점을 크롤링 하는 파이썬 프로그램작성 - 무작위의 네이버 영화 평점별 리뷰 데이터 크롤링 https://movie.naver.com/movie/point/af/list.naver? 평점 : 네이버 영화 네티

comemann.tistory.com

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

목적 - 잡플래닛의 기업리뷰정보를 크롤링 1. 필요사항 Import 및 잡플래닛 ID와 PW기입 - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import

comemann.tistory.com

2023.02.02 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

목적 - 네이버 쇼핑의 '쇼핑몰리뷰'의 평점과 텍스트 크롤링 1. 필요사항 Import - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import Beautiful

comemann.tistory.com

 

반응형

목적

- 잡플래닛의 기업리뷰정보를 크롤링

 

 

 

 

1. 필요사항 Import 및 잡플래닛 ID와 PW기입

- 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임

# step1.프로젝트에 필요한 패키지 불러오기
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd
import requests
import re
import numpy as np


from selenium.webdriver.common.keys import Keys


# step2.로그인 정보 및 검색할 회사 미리 정의, 해당 회사의 리뷰 끝 페이지도 정의
usr = ""
pwd = ""

 

 

2. 크롬드라이버 설정 및 로그인 정보전달

# step3.크롬드라이버 실행 및 잡플래닛 로그인
driver = webdriver.Chrome("C:/Users/XXXXXX/Downloads/chromedriver.exe")

driver.get("https://www.jobplanet.co.kr/users/sign_in?_nav=gb")
time.sleep(5)

login_id = driver.find_element_by_css_selector("input#user_email")
login_id.send_keys(usr)

login_pwd = driver.find_element_by_css_selector("input#user_password")
login_pwd.send_keys(pwd)

login_id.send_keys(Keys.RETURN)
time.sleep(5)
k=0

 

 

3. 리스트 변수 정의

# step4.크롤링한 정보를 담을 리스트명 정의
list_div = []
list_cur = []
list_date =[]
list_stars = []
list_summery = []
list_merit = []
list_disadvantages = []
list_managers =[]
all_total_data = pd.DataFrame()

 

4. 크롤링 대상 회사를 선정하고 URL로 정리 후 크롤링진행[Main]

**df2에 해당하는 데이터

- 실제 수집URL을 회사별로 관리하고 아래 for문에서 해당 df2를 순회하며 크롤링진행

- 파일로 담아놓아도 되고 DB Table형태로 관리해도 됨(개인적으로 Table형태를 선호함)

for name,dit,ns_address,page in zip(df2['이름'],df2['크롤링구분'],df2['수집URL'],df2['설명']):
    
    
    
    
    page = int(page)
    # step5.원하는 회사의 리뷰 페이지까지 이동
    header = {'User-Agent': ''}
    driver.implicitly_wait(3)
    driver.get(ns_address)
    req = requests.get(ns_address,verify=False)
    html = req.text 
    soup = BeautifulSoup(html, "html.parser")
    
    if k ==0:
        driver.find_element_by_css_selector("button.btn_close_x_ty1 ").click()
        time.sleep(3)
    
    # step6.원하는 회사의 직무/근속여부/일시/요약/평점/장점/단점/경영진에게 바라는 점 크롤링 (for문으로 반복)
    for i in range(page): 
        
        try:
            user_info = driver.find_elements_by_css_selector("span.txt1")
            count = int(len(user_info)/4)
            list_user_info = []

            #별점
            stars = driver.find_elements_by_css_selector("div.star_score")
            for j in stars:
                a = j.get_attribute('style')
                if a[7:9] == '20':
                    list_stars.append("1")
                elif a[7:9] == '40':
                    list_stars.append("2")
                elif a[7:9] == '60':
                    list_stars.append("3")
                elif a[7:9] == '80':
                    list_stars.append("4")
                else:
                    list_stars.append("5")
            
            #요약 정보
            summery = driver.find_elements_by_css_selector("h2.us_label")

            for j in summery:
                list_summery.append(j.text)

            #장점, 단점, 경영진에게 바라는 점
            list_review = []

            review = driver.find_elements_by_css_selector("dd.df1")

            for j in review:
                list_review.append(j.text)            
            for j in range(count):            #한 페이지에 정보 5set씩 나옴. 마지막 페이지는 5개 미만일 수 있으므로 count 변수를 반복횟수로 넣어줌.
                a = list_review[3*j]
                list_stars.append("5")
                list_summery.append(a)
                #list_merit.append(a)

                b = list_review[3*j+1]
                list_stars.append("1") 
                list_summery.append(b)
                #list_disadvantages.append(b)
                
        except:
            # 다음 페이지 클릭 후 for문 진행, 끝 페이지에서 다음 페이지 클릭 안되는 것 대비해서 예외처리 구문 추가
            try:
                driver.find_element_by_css_selector("a.btn_pgnext").click()
                time.sleep(15)
            except:
                print("break1")
                break

            
        # 다음 페이지 클릭 후 for문 진행, 끝 페이지에서 다음 페이지 클릭 안되는 것 대비해서 예외처리 구문 추가
        try:
            driver.find_element_by_css_selector("a.btn_pgnext").click()
            time.sleep(15)
        except:
            break
            print("break2")
                
    
    print(name, i)
    k=k+1
    # step7.pandas 라이브러리로 표 만들기
    total_data = pd.DataFrame()
    total_data['크롤링구분'] = '잡플래닛'
    total_data['평점'] = pd.Series(list_stars)
    total_data['리뷰'] = pd.Series(list_summery)

 

 

5. Data Frame 출력결과

total_data

 

 

 

 

 

 

 

 

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

목적 - 감정분석을 위해 네이버 영화평점을 크롤링 하는 파이썬 프로그램작성 - 무작위의 네이버 영화 평점별 리뷰 데이터 크롤링 https://movie.naver.com/movie/point/af/list.naver? 평점 : 네이버 영화 네티

comemann.tistory.com

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

목적 - 잡플래닛의 기업리뷰정보를 크롤링 1. 필요사항 Import 및 잡플래닛 ID와 PW기입 - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import

comemann.tistory.com

2023.02.02 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

목적 - 네이버 쇼핑의 '쇼핑몰리뷰'의 평점과 텍스트 크롤링 1. 필요사항 Import - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import Beautiful

comemann.tistory.com

 

반응형

 

목적

- 감정분석을 위해 네이버 영화평점을 크롤링 하는 파이썬 프로그램작성

- 무작위의 네이버 영화 평점별 리뷰 데이터 크롤링

 

https://movie.naver.com/movie/point/af/list.naver? 

 

평점 : 네이버 영화

네티즌 평점과 리뷰 정보 제공

movie.naver.com

 

 

1. 관련 라이브러리 Import

import requests
from selenium import webdriver
import time
from bs4 import BeautifulSoup
import pandas as pd
import random
import urllib.parse as parse
from sqlalchemy import create_engine
import pymysql

from selenium.webdriver.common.keys import Keys

 

2. 반복문으로 1000페이지까지 크롤링진행


results = []
for i in range(1, 1001):
    url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'.format(i)
    r = requests.get(url)
    bs = BeautifulSoup(r.text, "lxml")
    trs = bs.select("table.list_netizen > tbody > tr")
    for tr in trs:  #다수의 평점

        number = tr.select_one("td.ac.num").text
        writer = tr.select_one("td.num > a.author").text
        tr_data = tr.select_one("td.title")
        title = tr_data.select_one("a").text

        point = tr_data.select_one("div.list_netizen_score > em").text
        if point =='1' or point =='2':
            point = '1'
        elif point =='3' or point =='4':
            point = '2'
        elif point =='5' or point =='6':
            point = '3'
        elif point =='7' or point =='8':
            point = '4'       
        else:
            point = '5' 
        # td class="title" 태그에서 a, div, br 태그 제거
        # extract() 함수는 태그와 태그의 내용까지 모두 제거
        [x.extract() for x in tr_data.select("a")]
        [x.extract() for x in tr_data.select("div")]
        [x.extract() for x in tr_data.select("br")]


        content = tr_data.text.strip()
        #리뷰가 없으면 건너뛰자
        if content ==None:
            continue
        
        results.append(('네이버영화',point,content))

 

3. 필요한 컬럼 Select

df = pd.DataFrame(results, columns=['크롤링구분','평점','리뷰'])
df

 

4. 결과 Dataframe으로 출력

 

 

- 해당 데이터로 최신의 리뷰들로 학습데이터를 얻을수 있었음

- 꽤 많은 데이터를 Class(평점)분류 에 따라 수집할 수 있음

 

 

 

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

목적 - 감정분석을 위해 네이버 영화평점을 크롤링 하는 파이썬 프로그램작성 - 무작위의 네이버 영화 평점별 리뷰 데이터 크롤링 https://movie.naver.com/movie/point/af/list.naver? 평점 : 네이버 영화 네티

comemann.tistory.com

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

목적 - 잡플래닛의 기업리뷰정보를 크롤링 1. 필요사항 Import 및 잡플래닛 ID와 PW기입 - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import

comemann.tistory.com

2023.02.02 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

목적 - 네이버 쇼핑의 '쇼핑몰리뷰'의 평점과 텍스트 크롤링 1. 필요사항 Import - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import Beautiful

comemann.tistory.com

 

반응형

 

 

목적

- OpenDart를 사용해 공시데이터를 조회

- OpenDart에서 Key로 사용하는 기업코드(corp_code)를 받아와서 Data Frame으로 저장

- 추후 해당 기업코드로 다양한 OpenDart API 활용

 

 

 

기본적인 라이브러리 들을 Import합니다

import pandas as pd
import requests
import xml.etree.ElementTree as et
from io import BytesIO
from zipfile import ZipFile
import urllib3

 

 

해당 구조로 하는 이유는 다른 API 접속 프로그램을 만들때 url_json과 params 부분만 수정 및 추가해주면 되기 때문입니다.

 

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) #워닝 메시지 미출력


#[1]  고유번호조회
### OPENDART 개발 가이드
url_json = 'https://opendart.fss.or.kr/api/corpCode.xml'
api_key = '발급받은APIKey'

params = {
    'crtfc_key': api_key,
}

 

 

Zipfile형태는 file로 로드한 뒤에 읽어내야 합니다.

 

아래처럼 requests로 불러온뒤 XML을 다운받은 후 string으로 읽습니다.

# OpenDART에서 Zipfile 받아와 객체에 저장하기
u = requests.get(url_json, params=params,verify=False)
zipfile_bytes = u.content
zipfile_obj = ZipFile(BytesIO(zipfile_bytes))

# 압축을 풀어서 XML File을 string으로 담기
xmlfile_objs = {name: zipfile_obj.read(name) for name in zipfile_obj.namelist()}
xml_str = xmlfile_objs['CORPCODE.xml'].decode('utf-8')

 

 

읽어서 Dataframe에 담는 부분입니다.

반복문을 사용해 읽어냅니다.


# XML String을 가져와서 DataFrame에 담기
xroot = et.fromstring(xml_str)

df_cols = ["corp_code", "corp_name", "stock_code", "modify_date"]
rows = []

for node in xroot: 
    res = []
    for el in df_cols[0:]: 
        if node is not None and node.find(el) is not None:
            res.append(node.find(el).text)
        else: 
            res.append(None)
    rows.append({df_cols[i]: res[i] 
                  for i, _ in enumerate(df_cols)})

df_cor = pd.DataFrame(rows, columns=df_cols)

 

 

아래처럼 잘 들어오는것을 확인할 수 있습니다.

반응형

목적

- Synology 패키지에서 기본 제공하는 DB인 mariaDB(mysql 기반)의 DB에 원격으로 접속하는 파이썬 코드를 작성

- SQL로 출력된 데이터를 Dataframe 형태로 받아온다 => 인지시에는 Table형태가 익숙하고 유리하다.

 

 

 

위 네개 패키지 기본 설치 진행

mysql-connector 가 없으면 연결시 에러처리 되니 유의

!pip install pymysql
!pip install mysql
!pip install mysql-connector
!pip install sqlalchemy
import pymysql
from pandas import json_normalize
from sqlalchemy import create_engine

#DB관련 라이브러리
import mysql.connector as mariadb
from mysql.connector import Error

# MySQL Connector using pymysql
pymysql.install_as_MySQLdb()
import MySQLdb

import pandas as pd

 

 

 

 

 

접속부분에서 아래 코드에서 접속ID , 비밀번호, DB접속주소/스키마명 을 수정하여 사용한다

encoding은 한글이 있어서 utf-8을 기준으로 한다

 

# DB connection
try:    
    engine = create_engine("mysql+mysqldb://접속ID:"+"비밀번호"+"@DB접속주소/스키마명", encoding='utf-8')
    conn = engine.connect()        
except Error as e:
    print("Error while connecting to MySQL", e)
finally:
    print("Complete")
 
 
 
 
 
 
sql문을 작성하고 이를 연결된 DB에 실행하고 Dataframe형태로 가져온다
 
# SQL문 실행
sql = "SELECT * FROM api_apt.지역코드관리" 
df1 = pd.read_sql(sql, conn)

 

 

 

 

아래 형태로 가져와 지는것을 확인할 수 있다

역시 Table형태로 보니 심플하다

 

반응형

+ Recent posts