파이썬에서 PhantomJS를 사용하는 방법이 있습니까?


203

Python 에서 PhantomJS 를 사용하고 싶습니다 . 이 문제를 봤지만 적절한 해결책을 찾지 못했습니다.

내가 찾을 수 os.popen() 있는 좋은 선택이 될 수 있습니다. 그러나 나는 그것에 대한 몇 가지 주장을 전달할 수 없었습니다.

지금 사용 subprocess.Popen()하는 것이 적절한 해결책 일 수 있습니다. 더 나은 솔루션이 있는지 여부를 알고 싶습니다.

파이썬에서 PhantomJS를 사용하는 방법이 있습니까?


아래 내 대답은 방법을 알려줍니다. 귀하의 질문과 실제로 Selenium 이하는 것과 정확히 일치 subprocess.popen하지만 api를 원활하게하기위한 확장 기능이 있습니다.
Pykler

@ flyer : 허용되는 답변을 변경하는 것이 좋습니다. 아래를 참조하십시오. 감사합니다.
dotancohen

답변:


373

파이썬에서 PhantomJS를 사용하는 가장 쉬운 방법은 Selenium을 이용하는 것입니다. 가장 간단한 설치 방법은

  1. NodeJS 설치
  2. Node의 패키지 관리자를 사용하여 phantomjs를 설치하십시오. npm -g install phantomjs-prebuilt
  3. 셀레늄 설치 (가상 환경에서 사용하는 경우)

설치 후 팬텀을 다음과 같이 간단하게 사용할 수 있습니다.

from selenium import webdriver

driver = webdriver.PhantomJS() # or add to your PATH
driver.set_window_size(1024, 768) # optional
driver.get('https://google.com/')
driver.save_screenshot('screen.png') # save a screenshot to disk
sbtn = driver.find_element_by_css_selector('button.gbqfba')
sbtn.click()

시스템 경로 환경 변수가 올바르게 설정되지 않은 경우 정확한 경로를에 인수로 지정해야합니다 webdriver.PhantomJS(). 이것을 교체하십시오 :

driver = webdriver.PhantomJS() # or add to your PATH

... 다음과 함께 :

driver = webdriver.PhantomJS(executable_path='/usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs')

참고 문헌 :


40
이것은 아름답게 작동했으며 아마도 날을 구했을 것입니다. 감사합니다. 전체 렌더링 된 페이지를 소스로 다시 원할 경우 driver.page_source입니다.
scharfmn

4
이것은 아름답게 작동 하며 phantomjs.org/faq.html 에서 "Node.js 모듈이 아님" 이라고 말했기 때문에 유쾌하게 놀랍습니다 . 제 경우에는 이것을하고 싶었습니다. 그리고 ... 효과가있었습니다! bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML")
MarkHu

8
나는 유령이 미친 의존성을 가지고 있다는 것에 동의하며 실제로 수백만 개의 X11 관련 라이브러리를 설치 한 후에도 실제로 실행하지 못했습니다. 유령은 공포 이야기입니다.
Pykler

5
@phabtar PhantomJS의 첫 번째 인수로 phantomjs의 경로를 전달해야합니다. 또는 phantomjs를 볼 수 있도록 Windows syspath를 수정하십시오.
Pykler

2
바보 같은 질문 : 왜 node-js를 설치해야합니까? pahantomJs를 얻는 다른 방법이 없습니까?
Eildosa

80

PhantomJS는 최근 Python 지원을 완전히 중단 했습니다. 그러나 PhantomJS는 이제 Ghost Driver를 포함 합니다.

이후 빈 공간을 채우기 위해 새로운 프로젝트가 시작되었습니다 ghost.py. 당신은 아마 그것을 대신 사용하고 싶을 것입니다 :

from ghost import Ghost
ghost = Ghost()

with ghost.start() as session:
    page, extra_resources = ghost.open("http://jeanphi.me")
    assert page.http_status==200 and 'jeanphix' in ghost.content

21
지원이 중단되었지만 npm (노드 패키지 관리자)을 설치하고 최신 phantomjs (웹 드라이버 지원 포함)를 설치하고 Python에 셀레늄을 설치하는 것이 PyQT 또는 PySide를 올바르게 작동시키는 것보다 쉬운 방법이라는 것을 알았습니다. 팬텀의 장점은 사실상 헤드리스이며 작동하는 UI / X11 관련 라이브러리가 필요하지 않습니다.
Pykler

12
ghost.py를 사용하고 내 인생을 미워한 후에 선호하는 솔루션을 설명하는 아래 답변을 추가했습니다
Pykler

8
피클 러의 "내 인생을 싫어하는"은 과소 평가가 아니다. 누군가이 질문에 대한 "정답"을 Pykler 's로 바꾸면 하루의 노력을 절약했을 것입니다.
YPCrumble

2
@YPCrumble : 불행히도 OP 만 가능합니다. 허용 된 답변을 변경하십시오.
Martijn Pieters

3
오늘 아침에 여러 가지 접근 방식을 시도한 후 @Pykler 솔루션이 가장 원활하게 작동했습니다.
andyzinsser

40

GhostDriver에는 PhantomJS가 번들로 제공되므로 Selenium을 통해보다 편리하게 사용할 수 있습니다.

Pykler가 제안한대로 PhantomJS의 노드 설치를 시도했지만 실제로는 PhantomJS의 독립형 설치보다 느립니다. 독립 실행 형 설치는 이러한 기능을 이전에 제공하지 않았지만 v1.9부터는 많은 기능을 제공합니다.

  1. PhantomJS 설치 ( http://phantomjs.org/download.html ) (Linux를 사용하는 경우 https://stackoverflow.com/a/14267295/382630 도움이 될 것입니다 )
  2. pip를 사용하여 Selenium을 설치하십시오.

이제 이렇게 사용할 수 있습니다

import selenium.webdriver
driver = selenium.webdriver.PhantomJS()
driver.get('http://google.com')
# do some processing

driver.quit()

3
Ubuntu에 PhantomJS 설치에 관한 SO 답변을 지적 해 주셔서 감사합니다.
Dennis Golomazov

방금 배운 Selenium을 설치하는 빠른 방법은 Windows에서 C : \ Python34 \ Scripts \ pip.exe install Selenium을 입력하는 것입니다.
ntk4

8

PhantomJS와 Django를 사용하여 자바 스크립트를 테스트하는 방법은 다음과 같습니다.

mobile / test_no_js_errors.js :

var page = require('webpage').create(),
    system = require('system'),
    url = system.args[1],
    status_code;

page.onError = function (msg, trace) {
    console.log(msg);
    trace.forEach(function(item) {
        console.log('  ', item.file, ':', item.line);
    });
};

page.onResourceReceived = function(resource) {
    if (resource.url == url) {
        status_code = resource.status;
    }
};

page.open(url, function (status) {
    if (status == "fail" || status_code != 200) {
        console.log("Error: " + status_code + " for url: " + url);
        phantom.exit(1);
    }
    phantom.exit(0);
});

mobile / tests.py :

import subprocess
from django.test import LiveServerTestCase

class MobileTest(LiveServerTestCase):
    def test_mobile_js(self):
        args = ["phantomjs", "mobile/test_no_js_errors.js", self.live_server_url]
        result = subprocess.check_output(args)
        self.assertEqual(result, "")  # No result means no error

테스트 실행 :

manage.py test mobile


감사. 나는 subprocess.Popen 을 사용 하여 phantomjs 스크립트를 호출했으며 작동했습니다 :)
flyer

이것이 어떻게 제한되는지 알 수 있습니까? phantomjs를 실행하기 위해 쉘 호출을하는 것입니다. 실제로 예외, 차단 등을 제대로 처리 할 수있는 "적절한"인터페이스를 사용하고 있지 않습니다.
kamelkev

@ kamelkev : 이것이 어떻게 제한되는지 봅니다. 이 방법을 사용하면 장고의 부트 스트랩 기능을 사용하여 각 테스트에 대한 올바른 내용으로 테스트 데이터베이스를 설정할 수 있습니다. 그렇습니다. 두 세계를 최대한 활용하기 위해 다른 답변과 결합 할 수 있습니다.
Emil Stenström

6

@Pykler답변 은 훌륭하지만 노드 요구 사항은 오래되었습니다. 이 답변의 의견은 더 간단한 답변을 제안하며, 다른 사람들의 시간을 절약하기 위해 여기에 넣었습니다.

  1. PhantomJS 설치

    @ Vivin-Paliath가 지적했듯이, 그것은 Node의 일부가 아닌 독립형 프로젝트입니다.

    맥:

    brew install phantomjs

    우분투 :

    sudo apt-get install phantomjs

    기타

  2. virtualenv(아직 설정 하지 않은 경우) 설정 :

    virtualenv mypy  # doesn't have to be "mypy". Can be anything.
    . mypy/bin/activate

    컴퓨터에 Python 2와 3이 모두 있으면 실행 virtualenv-3.6 mypy또는 유사 해야 할 수도 있습니다 .

  3. 셀레늄 설치 :

    pip install selenium
  4. 문서 에서 빌린 다음과 같은 간단한 테스트를 시도하십시오 .

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    driver = webdriver.PhantomJS()
    driver.get("http://www.python.org")
    assert "Python" in driver.title
    elem = driver.find_element_by_name("q")
    elem.clear()
    elem.send_keys("pycon")
    elem.send_keys(Keys.RETURN)
    assert "No results found." not in driver.page_source
    driver.close()

PhantomJSWindows 에 설치하는 방법 ? pip명령을 사용하여 작동하지 않는 것 같습니다 .
MD. 카이 울 바 사르

1
Pip은 Python 패키지 설치 프로그램이므로 Python 패키지로 제공되는 셀레늄과 함께 작동합니다. PhantomJS는 파이썬 패키지가 아니므로 pip에서는 작동하지 않습니다. 나는 "PhantomJS 설치 창"에 대한 빠른 구글을했고 좋은 히트가 있습니다.
앤드류 E

5

이것이 내가하는 일입니다 .python3.3. 거대한 사이트 목록을 처리하고 있었으므로 시간 초과가 실패하면 작업이 전체 목록을 실행하는 데 매우 중요했습니다.

command = "phantomjs --ignore-ssl-errors=true "+<your js file for phantom>
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)

# make sure phantomjs has time to download/process the page
# but if we get nothing after 30 sec, just move on
try:
    output, errors = process.communicate(timeout=30)
except Exception as e:
    print("\t\tException: %s" % e)
    process.kill()

# output will be weird, decode to utf-8 to save heartache
phantom_output = ''
for out_line in output.splitlines():
    phantom_output += out_line.decode('utf-8')

고마워, 나는 내 목적에 맞게 맛을 바꿀 수있었습니다.
iChux

5

Anaconda를 사용하는 경우 다음을 설치하십시오.

conda install PhantomJS

스크립트에서 :

from selenium import webdriver
driver=webdriver.PhantomJS()

완벽하게 작동합니다.


지금부터, 기본 채널은 linux64에 대한 PhantomJS 포함되어 있지 않습니다
유진 Pakhomov

젠장, 나는 너무 쉬운 콘다 <3를 좋아한다. 나는 osx에있다.
O.rka

1

당신이 사용하는 경우 Buildout을 쉽게 Pykler을 사용하여 설명하는 설치 프로세스를 자동화 할 수 있습니다 gp.recipe.node의 조리법을.

[nodejs]
recipe = gp.recipe.node
version = 0.10.32
npms = phantomjs
scripts = phantomjs

이 부분은 node.js를 바이너리 (적어도 내 시스템에서는)로 설치 한 다음 npm을 사용하여 PhantomJS를 설치합니다. 마지막으로 bin/phantomjsPhantomJS 웹 드라이버를 호출 할 수 있는 진입 점을 만듭니다 . Selenium을 설치하려면 계란 요구 사항 또는 빌드 아웃 구성에서 Selenium을 지정해야합니다.

driver = webdriver.PhantomJS('bin/phantomjs')

1
또 다른 방법은 그냥 사용의 buildout으로 설치 프로세스를 자동화하는 gp.recipe.phantomjs, 즉를 구성 phantomjs하고casperjs
gakhov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.