>  기사  >  백엔드 개발  >  Python 크롤러 도구 Selenium 사용 방법에 대한 자세한 설명

Python 크롤러 도구 Selenium 사용 방법에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-03-08 11:25:092432검색

소개:

Python을 사용하여 동적 페이지를 크롤링하는 경우 일반 urllib2를 구현할 수 없습니다. 예를 들어 아래 JD 홈페이지는 스크롤 막대에 따라 새 콘텐츠를 로드합니다. , 그리고 urllib2는 이 콘텐츠를 크롤링할 수 없습니다. 이때 오늘의 주인공인 셀레늄이 필요합니다.

Python 크롤러 도구 Selenium 사용 방법에 대한 자세한 설명

Selenium은 웹 애플리케이션 테스트를 위한 도구입니다. Selenium 테스트는 실제 사용자와 마찬가지로 브라우저에서 직접 실행됩니다. 지원되는 브라우저에는 IE, Mozilla Firefox, Mozilla Suite 등이 있습니다. 또한 페이지를 크롤링하는 데 매우 편리합니다. 사용자 작업을 시뮬레이션하기 위한 액세스 단계만 수행하면 됩니다. 쿠키 및 세션 처리에 대해 전혀 걱정할 필요가 없습니다. 비밀번호를 입력한 다음 로그인 버튼을 클릭하세요. 스크롤바 위의 경우 브라우저를 맨 아래로 스크롤하고 페이지를 저장하기만 하면 됩니다. 위의 기능은 일부 크롤러 방지 메커니즘을 처리할 때 매우 유용합니다. 다음으로 설명의 본문을 시작하고 로그인이 필요한 동적 웹페이지를 크롤링하도록 안내합니다.

케이스 구현:

셀늄을 사용하려면 호출 브라우저를 선택하고 해당 드라이버를 다운로드해야 합니다. FireFox 등을 선택할 수 있고, 서버 측에서는 PhantomJS를 사용할 수 있으며, 데스크톱 버전은 브라우저에서 직접 호출하여 변경 사항을 관찰할 수 있으므로 일반적으로 데스크톱 버전을 디버깅한 후 브라우저를 PhantomJS로 변경할 수 있습니다. Chrome 등을 서버에 업로드하여 실행합니다. 여기에서는 데모용으로 PhantomJS를 직접 사용합니다.

먼저 모듈을 가져옵니다.

 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 from selenium import webdriver

Connect 아래로 내려갈 때 브라우저를 초기화합니다. 매개변수에서 로드된 웹 페이지의 일부 속성을 지정할 수 있습니다:

cap = webdriver.DesiredCapabilities.PHANTOMJS
cap["phantomjs.page.settings.resourceTimeout"] = 180
cap["phantomjs.page.settings.loadImages"] = False

driver = webdriver.PhantomJS(executable_path="/home/gaorong/phantomjs-2.1.1-linux-x86_64/bin/phantomjs", desired_capabilities=cap)

위의 내용은 PhantomJS를 초기화하고 브라우저의 경로를 설정합니다. loading 속성은 리소스 로딩 시간 제한을 선택하고 이미지를 로드하지 않습니다(웹 페이지 텍스트만 고려함). 여기에서 다른 설정을 선택할 수도 있습니다.

속성 설정 및 웹페이지 다운로드

driver.set_page_load_timeout(180)     
driver.get('http://www.php.cn/')
time.sleep(5)
driver.save_screenshot('./login.png')   #为便于调试,保存网页的截图

서버측에서 실행시 오류는 불가피하므로, save_screenshot을 이용하여 현재 웹페이지를 저장하여 디버깅이 용이하도록 할 수 있습니다.

다음 단계는 향후 요청을 위해 웹사이트의 쿠키를 얻기 위해 로그인할 계정과 비밀번호를 입력하는 것입니다.

#输入username和password 
driver.find_element_by_xpath("/html/body/div[1]/div[1]/login/div[2]/div/form/input[1]").send_keys('*****')   
time.sleep(1)
print 'input user success!!!'

driver.find_element_by_xpath("/html/body/div[1]/div[1]/login/div[2]/div/form/input[2]").send_keys('****')
time.sleep(1)
print 'input password success!!!'

driver.find_element_by_xpath("/html/body/div[1]/div[1]/login/div[2]/div/form/button").click()
time.sleep(5)

위 코드는 find_element_by_xpath를 이용해 입력창의 위치를 ​​알아내고 계정과 비밀번호를 입력한 후 로그인 버튼을 누르면 매우 편리하다는 것을 알 수 있습니다. 그러면 자동으로 다음 페이지로 넘어갑니다. 몇 초 동안 잠자기 상태로 기다리기만 하면 됩니다.

크롤링해야 하는 웹페이지 정보는 특정 요소에 있으므로 이 요소가 나타나는지 확인해야 합니다.

try:
     element = WebDriverWait(driver, 10).until(
         EC.presence_of_element_located((By.CLASS_NAME, 'pulses'))
     )
     print 'find element!!!'        
 except:
     print 'not find element!!!'
     print traceback.format_exc()
     driver.quit()

위에서는 'pulse' 클래스가 있는 요소가 나타나는지 여부를 결정합니다. 10초 동안 기다린 후에도 나타나지 않으면 selenum은 TimeoutError를 발생시킵니다.

위에서 기본 초기화를 수행한 후 동적 콘텐츠를 처리해야 합니다. 이 웹 페이지는 JD.com과 마찬가지로 드롭다운이 있는 콘텐츠가 자동으로 표시되므로 드롭다운 스크롤 막대를 구현해야 합니다.

print 'begin scroll to get info page...'
t1 = time.time()
n = 60   #这里可以控制网页滚动距离
for i in range(1,n+1):
    s = "window.scrollTo(0,document.body.scrollHeight/{0}*{1});".format(n,i)
    #输出滚动位置,网页大小,和时间
    print s, len(driver.page_source),time.time()-t1
    driver.execute_script(s)
    time.sleep(2)

여기서 드라이버.페이지_소스는 웹페이지 텍스트를 가져옵니다. 스크롤이 완료되면 이를 호출하여 파일에 쓸 수 있습니다. 이것으로 프로그램 논리가 완성됩니다.

고급:

selenim을 사용하면 일반적인 크롤러 방지 전략을 처리할 수 있습니다. 이는 사람이 웹을 탐색하는 것과 동일하지만 인증 코드를 위해서는 추가 처리가 필요하기 때문입니다. , 또 다른 점은 액세스 속도가 너무 빨라서는 안 된다는 점입니다. 결국 브라우저를 호출해야 합니다. 너무 느리면 필요하지 않을 경우 요청 라이브러리를 사용하여 작업할 수 있습니다. .

다음은 참고할 수 있는 두 개의 블로그입니다. Python Crawler Tool Five: Selenium Usage and Common Functions


위 내용은 Python 크롤러 도구 Selenium 사용 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.