크롤링에 필요한 모듈부터 다운로드 받자.
pip3 install selenium
pip3 install requests
pip3 install bs4
pip3 install html_table_parser
html_table_parser official site
Selenium automates browsers. That's it!
셀레니움은 자동화된 브라우저 입니다. 끝!
특정한 브라우저의 드라이버를 실행시켜 웹 애플리케이션을 자동화
하게 해주는 모듈이라는 것이다.from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://selenium.dev")
driver.quit()
r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
r.status_code
200
r.headers['content-type']
'application/json; charset=utf8'
r.encoding
'utf-8'
r.text
'{"type":"User"...'
r.json()
{'private_gists': 419, 'total_private_repos': 77, ...}
<table>
을 파싱해주는 모듈이다.from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
from html_table_parser import parser_functions
import no_connection_test
# 드라이버 초기화
driver = webdriver.Chrome("/opt/homebrew/bin/chromedriver")
try:
driver.get("http://www.unct.co.kr/eservice/#/ES010_100")
element = WebDriverWait(driver, 10) # request wait 걸기
html = driver.page_source # page_source 얻기
soup = BeautifulSoup(html, 'html.parser') # get html
table = soup.select_one('.k-grid-table') # table select
get_table_text = parser_functions.make2d(table) # table parsing
print(get_table_text)
for index, get in enumerate(get_table_text, 1):
print('{}번째 {}데이터'.format(index, get))
berth_code = ''.join(get[:1]) # 선석코드
trminl_voyg = ''.join(get[1:2]) # 모선-항차
trminl_shipnm = ''.join(get[2:3]) # 선명
wtorcmp_code = ''.join(get[3:4]) # 선사
# sunsuck = ''.join(get[:5]) # 입항 항차
# sunsuck = ''.join(get[:6]) # 출항 항차
csdhpDrc = ''.join(get[6:7]) # 접안 위치
trminlShipnm = ''.join(get[7:8]) # 선대명
tkin_closde = ''.join(get[8:9]) # 반입 마감 시간
csdhp_prarnde = ''.join(get[9:10]) # 접안 (예정) 일시
tkoff_prarnde = ''.join(get[10:11]) # 출항 (예정) 일시
landng_qy = ''.join(get[11:12]) # 양하
shipng_qy = ''.join(get[12:13]) # 적하
reshmt_qy = ''.join(get[13:14]) # 이적
# sunsuck = ''.join(get[:15]) # 상태
# dict로 만들기
result = {
"berthCode":berth_code,
"trminlVoyg":trminl_voyg,
"trminlShipnm":trminl_shipnm,
"wtorcmpCode":wtorcmp_code,
"csdhpDrc":csdhpDrc,
"trminlShipnm":trminlShipnm,
"tkinClosde":tkin_closde,
"csdhpPrarnde":csdhp_prarnde,
"tkoffPrarnde":tkoff_prarnde,
"landngQy":landng_qy,
"shipngQy":shipng_qy,
"reshmtQy":reshmt_qy,
}
no_connection_test.post(result)
finally:
driver.quit()
enumerate
함수를 통해서 Index와 원소를 얻을 수 있어 수월했다.import requests
# requests 기본 데이터
post_url = 'http://localhost:'
headers = {
'Content-Type': 'application/json; charset=utf-8'
}
# post
def post(result):
respone = requests.post(post_url, json=result, headers=headers)
respone.close()
class BerthStatPyController {
create = async (req, res, next) => {
try {
const data = req.body;
console.log(data);
const result = berthStat.create(data);
res.send(result);
} catch (error) {
next(error);
} finally {
}
};
}
import no_connection_test
import moment
import requests
# 울산
try:
# 요청 url
# 1달 주기로 검색
req_url = 'http://www.unct.co.kr/json/comm/commonSelect.do?sqlId=es010_100Qry.selectBerthScheduleList&from={}&to={}'.format(
moment.date('1 month ago').format('YYYYMMDD'), moment.now().format('YYYYMMDD'))
# print(req_url)
response = requests.get(req_url)
# print(response)
# JSON으로 파싱
result = response.json()
# body 데이터
body = result['queryResult']
# print(result['queryResult'][0])
# 데이터 확인
for index, result in enumerate(body, 1):
print('{}번째 데이터 : {}'.format(index, result))
data = {
'trminlCode': 'UNCT', # 터미널코드
'berthCode': result['position'], # 선석
'trminlVoyg': result['aa'], # 모선항차
'trminlShipnm': result['cdvVslName'], # 선명
'wtorcmpCode': result['cdvVslOperator'], # 선사
'csdhpDrc': result['vsbVoyStartpos'], # 접안위치
'trminlShipnm': result['vsbVoyOutservice'], # 선대명
'tkinClosde': result['cct'], # 반입 마감 시간
'csdhpPrarnde': result['etb'], # 접안 예정 일시
'tkoffPrarnde': result['etd'], # 출항 예정 일시
'landngQy': result['vsbVoyDisvan'], # 양하
'shipngQy': result['vsbVoyLoadvan'], # 적하
'reshmtQy': result['vsbVoyTsvan'], # 이적
}
print(data)
no_connection_test.post(data)
finally:
response.close()
# driver.quit()