-
[python] 웹 사이트 크롤링(parsing) with BeautifulSoup/requests/seleniumPrograming/python 2020. 3. 16. 01:55
python을 이용해 웹 사이트 파싱을 한번 해보자.
간단한 파싱 예제는 구글에 검색하면 충분히 접 할 수 있다.
이 글은 javascript를 통해 비동기적으로 데이터가 뿌려지거나(딜레이 로드),
파싱하는 과정에서 클릭 등과 같은 이벤트가 필요할때 유용하고자 함을 목적으로 한다.
python3를 사용하며,
필요한 모듈은 아래와 같이 pip3를 사용해 설치해준다.
# install modules pip3 install requests # 이 예제에선 사용 안함 pip3 install bs4 pip3 install selenium pip3 install webdriver-manager
그리고 여기 에서 OS에 맞게 geckodriver를 다운로드하여 적당한 위치에 압축을 풀어준다.
나의 경우 프로젝트 루트에 압축을 풀었다.
긴 설명 없이 바로 코드로 말한다.
먼저 관련 모듈을 가져온다.
// crawling.py import time # 딜레이를 위함 # import requests # html 파싱 from bs4 import BeautifulSoup # 파싱된 데이터를 python에서 사용하기 좋게 변환 from selenium import webdriver # webdriver를 통해 파싱하기 위함 driver = webdriver.Firefox(executable_path='./geckodriver') # Firefox사용 (또는 chromium)
driver를 통해 실제 브라우저(Firefox)를 실행해 페이지를 로드하고
해당 페이지의 모든 javascript가 실행된 후 html을 가져온다.
(이 방법을 사용하지 않으면 javascript에서 생성된 데이터를 가져올 수 없다.)
그리고 BeautifulSoup를 통해 작업하기 쉽게 구조화시킨다.
driver.get('WEBSITEURL') html = driver.page_source soup = BeautifulSoup(html)
그런 뒤 사이트에 들어가 원하는 객체의 태그 selector를 가져온다.
직접 하지말고 브라우저의 개발자도구 탭에서 가져오면 쉽게 가져올 수 있다.
#contents > table > tbody
앞서 가져온 selector를 이용해 아래와 같이 사용하면
해당 tbody 안 tr 안 모든 td들을 출력된다.
tbody = soup.select( '#contents > table > tbody' ) # prodList = soup.find_all("태그명", {"class": "클래스명"}) for trs in tbody: for tds in trs.findAll('td'): print(tds)
만약 버튼을 눌러야 원하는 데이터가 나타나는 경우는
아래와 같이 버튼의 태그를 찾아 스크립트 코드를 복사한다.
그리고 driver.execute_script 함수 호출시 인자로 넘겨주면 된다.
driver.execute_script("스크립트코드") time.sleep(1)
이 과정을 모두 마쳤다면,
이제 당신은 파싱 마스터다.
FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver': 'geckodriver' with GeckoDriver and Python in MAC OS
'Programing > python' 카테고리의 다른 글
[flask] python - UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte (0) 2021.11.22 [python] 파이썬에서 requests로 파일 전송하기. (0) 2020.11.03 [data statistics] Data distribution (0) 2019.11.26 [python] Make Korail reservation Macro with telegram bot (2) 2019.11.12 [python] python3 - urllib3 telepot ssl certificate verify error (0) 2019.11.11