반응형

파이썬을 이용한 웝 크롤링 (python web crawling with Selenium)

본문에서는 파이썬을 이용한 웹 크롤러 제작에 대한 내용을 다룹니다.

이전 포스터의 연장입니다. 내용 이해를 위하여 이전 포스트 확인 부탁드립니다.


1. 텍스트 데이터 수집하기

텍스트 데이터를 수집하는 방법은 비교적 간단한 편이다. 왜냐하면, 이전에 보았던 send_keys가 해당 개체에 값을 전달하는 것이었다면, text라는 녀석을 이용하여 손쉽게 해당 개체가 갖고있는 텍스트 정보를 갖고올 수 있기 때문입니다.

아래는 위키에서 네이버를 검색하고 검색 결과를 갖고오는 모습을 볼 수 있습니다.


보는바와 같이 겨우 7줄의 코드로 모든 과정이 수행됩니다.




< 코드 >

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('./chromedriver.exe')
driver.get('https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EB%8C%80%EB%AC%B8')
driver.find_element_by_xpath('//*[@id="mp_search"]/table/tbody/tr/td[1]/div/div/form/input[1]').send_keys('네이버')
driver.find_element_by_xpath('//*[@id="mp_search"]/table/tbody/tr/td[1]/div/div/form/input[1]').send_keys(Keys.ENTER)
print(driver.find_element_by_xpath('//*[@id="mw-content-text"]').text)



2. 이미지 데이터 수집하기

이미지 데이터 수집은 조금 복잡할 수 있습니다.

왜냐하면, 사이트마다 처리하는 방식이 많이 다르기 때문이죠.

저는 일단 가장 국내에서 대중적인 네이버를 대상으로 진행했습니다.


왼쪽이 코드고, 오른쪽은 파이썬이 제어하는 크롬화면입니다.


< 코드 >

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('./chromedriver.exe')
driver.get('https://naver.com')
driver.find_element_by_xpath('//*[@id="query"]').send_keys('마동석')
driver.find_element_by_xpath('//*[@id="query"]').send_keys(Keys.ENTER)
driver.find_element_by_xpath('//*[@id="lnb"]/div/div[1]/ul/li[2]/a/span').click()

link = []
for i in range(1, 30):
    try:
        img = driver.find_element_by_xpath('//*[@id="_sau_imageTab"]/div[1]/div[2]/div['+ str(i) + ']/a[1]/img')
    except:
        img = driver.find_element_by_xpath('//*[@id="_sau_imageTab"]/div[2]/div[2]/div['+ str(i) + ']/a[1]/img')
    link.append(img.get_attribute('src'))


왼쪽 코드부 하단에 link 라는 리스트에 저장되는 내용은 오른쪽 이미지들의 이미지 링크입니다.


반복문내에서 이미지 주소를 갖고와서 바로바로 저장하는 방법보다는 한번에 이미지들의 링크를 수집한 후 이 링크들의 이미지들을 다운로드 하는 방식이 저는 더 편해서 이렇게 했습니다. (중간에 애러떠도 수정하기 쉬우니까요)


그럼 최종적으로 이미지는 어떻게 저장할까요?


파이썬의 내장 라이브러리인 urllib를 사용합니다.




이렇게하면, 현재 파이썬 파일과 함께있는 img폴더에 이미지들이 하나씩 저장되게됩니다. 어때요? 간단하죠?


import urllib.request

count = 0
for url in link:
    count += 1
    urllib.request.urlretrieve(url, './img/img'+str(count)+'.jpg')




다음이야기~

일단 초급과정은 여기서 마무리하겠습니다. 여기서 조금만 응용하면 거의 대부분의 간단간단한 기능들은 모두 구현이 가능합니다.

다음 중급자 코스에서는 Headless 크롤링과, 서버를 속이는 방법을 작성하겠습니다..




반응형

+ Recent posts