Python을 사용하여 동적 페이지를 크롤링하는 경우 일반 urllib2를 구현할 수 없습니다. 예를 들어 아래 JD 홈페이지는 스크롤 막대에 따라 새 콘텐츠를 로드합니다. , 그리고 urllib2는 이 콘텐츠를 크롤링할 수 없습니다. 이때 오늘의 주인공인 셀레늄이 필요합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!