어떤 사이트든 HTML문서를 가져올 수 있다.
다음과 같이 requests.get(url)을 하면 그 응답이 담기게 되고, 에러가 없을 경우 .text를 하면 코드가 텍스트 형태로 담기게 된다.
.json을 하면 json형태로 담기는 것도 같은 방식이라고 생각한다.
또한, BeautifulSoup라는 것을 이용하면 그 코드를 쉽고 간편하게 원하는 것만 가져올 수 있는 기능을 사용할 수 있다.
soup = BeautifulSoup(response.text, 'html.parser')
shipping_result = soup.select_one('table.table_col > tbody > tr:first-child > td:last-child')
예를 들어 다음과 같이 작성한다면 html을 쉽게 파싱할 수 있다.
두 번째 문장이 무슨 의미냐 하면
1. class 이름이 table_col이라는 테이블을 찾는다.
- #을 이용하면 id도 검색이 가능하다!
2. 그 코드 안에서 가장 가까이있는 tbody로 들어간다.
3. 첫 번째 tr로 들어간다.
4. 마지막 td로 들어간다.
def getHanjinStatus(tracking_number):
url = 'https://www.hanjin.com/kor/CMS/DeliveryMgr/WaybillResult.do'
response = requests.post(url, data={'mCode':'MN038', 'wblnum':tracking_number,'schLang':'KR','wblnumtext':None})
soup = BeautifulSoup(response.text, 'html.parser')
shipping_result = soup.select_one('div.waybill-tbl > table > tbody > tr:last-child > td:last-child')
if not shipping_result:
print('shipping_result.text is empty')
return None
if any(s in shipping_result.text for s in ['배달완료','배송완료']):
return 'complete'
return 'shipping'
다음은 내가 오늘 짠 한진택배에서 특정 운송장의 배송 상태를 가져오는 함수이다.
먼저 https://www.hanjin.com/kor/CMS/DeliveryMgr/WaybillSch.do?mCode=MN038이 곳으로 post 요청한다. post로 넘겨줄 데이터의 형식은 f12를 누른 후 network에서 목록 중 맨 위의 것을 클릭한 후 payload를 살펴보면 알 수 있다. 형식을 맞추어 데이터를 넘겨주면 코드상으로 post요청을 하게 되는 것이다.
다음 빨간 화살표로 가리킨 부분이 왼쪽의 배송완료 부분이다.
따라서 shipping_result는 그냥 각 태그를 따라간 것이다.
beautiful soup를 잘 사용하면 좋을 것 같다.
'개발' 카테고리의 다른 글
DDL, DML이란? (3) | 2023.06.21 |
---|---|
내가 사용하는 유용한 단축키 모음! (0) | 2023.06.01 |
sqlalchemy event.listens_for (0) | 2023.05.10 |
원격 저장소에 해당 branch가 없을 때 (0) | 2023.04.13 |
포트 번호가 이미 사용중일 때 작업을 종료시키는 방법 (0) | 2023.04.13 |