파이썬으로 크롤링 툴을 하나 만들었는데 거기에 사용했던 메소드 정리
우선 Selenium으로 크롤링 하려면 Selenium을 깔아야된다. cmd창에서 pip install selenium해서 셀레늄 깔고 크롬을 사용해서 크롤링 해야하기 때문에 크롬 드라이버를 깔아준다.
https://sites.google.com/chromium.org/driver/
ChromeDriver - WebDriver for Chrome
WebDriver is an open source tool for automated testing of webapps across many browsers. It provides capabilities for navigating to web pages, user input, JavaScript execution, and more. ChromeDriver is a standalone server that implements the W3C WebDriver
sites.google.com
여기 사이트 들어가서 latest stable release 설치해줌. 대체로 stable 버전이기 때문에 다운 받아서 압축 풀고 작성할 파이썬 코드와 같은 폴더에 넣어주면 된다.
처음 크롤링 시작 전 옵션 설정
option = webdriver.ChromeOptions()
options.add_argument('window-size=1920, 1080')
options.add_argument('--incognito')
driver = webdriver.Chrome('chromedriver.exe', options = options)
window-size는 말 그대로 창 크기이고, --incognito는 크롬 창을 시크릿모드로 열어준다. 크롤링하면 방문하는 사이트가 많은데 기록 남기기 싫어서 시크릿모드로 열어서 크롤링 했다.
기본적으로 크롤링 할 때 사용한 것들
driver.find_element_by_xpath('xpath주소')
: xpath로 요소를 찾음
driver.find_element_by_xpath('xpath주소').click()
: xpath로 요소 찾고 클릭함
driver.find_element_by_name('name')
: 요소 이름으로 요소를 찾음
driver.find_element_by_name('name').send_keys(value)
: 요소 이름으로 요소를 찾고 거기에 값을 넣음 ex) 아이디 입력 칸에 아이디 입력, 검색창에 검색어 입력
driver.find_element_by_class_name('class name')
: 클래스 이름으로 요소를 찾음
len(driver.find_elements_by_class_name('class_name'))
: 클래스 이름으로 해당되는 요소들을 찾고 그 개수를 반환, element가 아니라 elements를 사용.
원래 len없이 그냥 find_elements_...만 쓰면 거기에 해당하는 요소들을 리스트 형태로 반환한다. 리스트 형태니까 len 쓰 면 개수 알 수 있음
e.is_displayed()
: e에 해당하는 요소가 현재 사이트에서 보이는지, 안 보이는지 확인
위에 적은 것으로 크롤링에 작성한 코드 중 일부
for button in driver.find_elements_by_xpath('//*[@id=......]/button'):
if button.is_displayed():
button.click()
else:
continue
for a in driver.find_elements_by_xpath('//*[@id=......]/p'):
a = a.text
if keyword in a:
return True
어떤 페이지에서 특정 버튼을 눌러야 정보를 볼 수 있는데 가끔은 그 버튼이 없는 경우도 있어서 버튼이 보일 때만 click하여 버튼을 다 누른 후에 키워드를 찾아 키워드가 있다면 True를 반환하는 부분.
search_box = driver.find_element_by_xpath('//*[@id="cli_shellHeaderSearchInput"]')
search_box.send_keys(title)
search_box.send_keys(Keys.RETURN)
sleep(5)
검색창을 찾아 검색창에 검색어를 입력하고 검색하는 부분. Keys.RETURN을 사용하려면 webdriver에서 keys를 import 해야된다. sleep(5) 이건 결과가 뜰 때까지 기다리려고 넣은 거.
e = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="cli_shellHeaderSearchInput"]')
)
if e:
e.send_keys(title)
위에 sleep보단 이런 방법이 훨씬 효율적이다. 해당되는 요소를 찾을 수 있을 때까지 최대 20초간 기다리는 것. 해당 요소를 찾으면 정해진 시간을 다 기다리지 않고 넘어갈 수 있어서 좋음.
크롤링하다가 에러 뜨는게 대부분 해당하는 요소를 찾을 수 없다... 이 오륜데 wait이나 sleep만 넣어줘도 대부분 해결된다.
대략 450개 검색해서 키워드 찾는 데에 3시간 쯤 걸린 거 같다. 오류만 안 나면...
크롤링 직접 만들어본건 처음인데 자료가 많고 생각보다 그리 어렵진 않아서 시도해볼만 한 것 같다.
이번에 사용하진 않았지만 크롤링 할 때 정규표현식(re)으로 특정 자료를 찾는 경우도 많아서 이것도 익혀 놓으면 좋을 것 같음.
아 그리고 난 혹시 몰라서 해당 사이트 robots.txt를 확인해보고 크롤링 돌렸다.
'파이썬' 카테고리의 다른 글
| 파이썬 코드로 cmd 명령어 입력하기, 파이썬으로 msu 압축파일 풀기 (0) | 2021.12.30 |
|---|---|
| [크롤링] 파이썬 selenium에서 새 탭 열기, 새 탭으로 이동하기 (0) | 2021.12.30 |