มีวิธีใช้ PhantomJS ใน Python หรือไม่?


203

ฉันต้องการใช้PhantomJSในหลาม ฉัน googled ปัญหานี้ แต่หาทางแก้ไขไม่ได้

ฉันคิดว่าos.popen() อาจเป็นทางเลือกที่ดี แต่ฉันไม่สามารถโต้แย้งได้

การใช้subprocess.Popen()อาจเป็นโซลูชันที่เหมาะสมในตอนนี้ ฉันต้องการทราบว่ามีวิธีแก้ปัญหาที่ดีกว่าหรือไม่

มีวิธีใช้ PhantomJS ใน Python หรือไม่?


คำตอบของฉันด้านล่างบอกวิธีการทำ เพียงแค่ดูคำถามของคุณและจริง ๆ แล้วนั่นคือสิ่งที่ซีลีเนียมทำsubprocess.popenแต่มีคุณสมบัติเพิ่มเติมบางอย่างเพื่อทำให้ API เป็นไปอย่างราบรื่น
Pykler

@flyer: คุณควรพิจารณาเปลี่ยนคำตอบที่ยอมรับดูด้านล่าง ขอบคุณ.
dotancohen

คำตอบ:


373

วิธีที่ง่ายที่สุดในการใช้ PhantomJS ในไพ ธ อนคือทางซีลีเนียม วิธีการติดตั้งที่ง่ายที่สุดคือ

  1. ติดตั้งNodeJS
  2. การใช้ตัวจัดการแพคเกจของโหนดการติดตั้ง phantomjs: npm -g install phantomjs-prebuilt
  3. ติดตั้งซีลีเนียม (ใน virtualenv ของคุณหากคุณกำลังใช้งานอยู่)

หลังจากการติดตั้งคุณสามารถใช้ phantom ง่าย ๆ เช่น:

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" - ใส่ wrapper npmที่npmjs.org/package/phantomjsเพื่อให้ทำงานได้ตามวัตถุประสงค์นี้ ในกรณีของฉันฉันต้องการทำสิ่งนี้: bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML")และ ... มันใช้งานได้!
MarkHu

8
ฉันยอมรับว่าผีมีการพึ่งพาอาศัยกันอย่างบ้าคลั่งและฉันล้มเหลวในการติดตั้งและใช้งานจริงแม้ว่าจะติดตั้งห้องสมุด X11 หลายล้านรายการแล้วก็ตาม ผีเป็นเรื่องสยองขวัญ
Pykler

5
@phabtar คุณต้องผ่านเส้นทางไปยัง phantomjs เป็นอาร์กิวเมนต์แรกของ PhantomJS ... หรือแก้ไข syspath ของ windows เพื่อให้สามารถเห็น phantomjs ได้
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 ล่าสุด (พร้อมการสนับสนุน webdriver) และการติดตั้งซีลีเนียมในไพ ธ อน ... วิธีที่ง่ายกว่าการพยายามให้ PyQT หรือ PySide ทำงานอย่างถูกต้อง มีอะไรดีเกี่ยวกับ phantom มันเป็นหัวขาดจริง ๆ และไม่ต้องการ libs ที่เกี่ยวข้องกับ UI / X11 ในการทำงาน
Pykler

12
ฉันได้เพิ่มคำตอบด้านล่างเพื่ออธิบายวิธีแก้ปัญหาที่ฉันต้องการหลังจากพยายามใช้ ghost.py และเกลียดชังชีวิตของฉัน
Pykler

8
Pykler's "เกลียดชีวิตของฉัน" ไม่ได้พูดเกินจริง หากใครบางคนจะเปลี่ยน "คำตอบที่ถูกต้อง" สำหรับคำถามนี้เป็น Pykler ของฉันจะได้บันทึกความพยายามของวัน
YPCrumble

2
@YPCrumble: น่าเสียดายที่ OP เท่านั้นที่ทำได้ เปลี่ยนคำตอบที่ยอมรับได้
Martijn Pieters

3
หลังจากลองใช้แนวทางที่แตกต่างกันในเช้าวันนี้โซลูชันของ @Pykler ก็ทำงานได้อย่างราบรื่นที่สุด
andyzinsser

40

ตอนนี้เนื่องจาก GhostDriver มาพร้อมกับ PhantomJS จึงสะดวกยิ่งขึ้นในการใช้งานผ่าน Selenium

ฉันลองติดตั้ง Node ของ PhantomJS ตามที่ Pykler แนะนำ แต่ในทางปฏิบัติฉันพบว่ามันช้ากว่าการติดตั้ง PhantomJS แบบสแตนด์อโลน ฉันเดาว่าการติดตั้งแบบสแตนด์อโลนไม่ได้ให้ฟีเจอร์เหล่านี้ก่อนหน้านี้ แต่ตั้งแต่ v1.9 มันทำอย่างนั้น

  1. ติดตั้ง PhantomJS ( http://phantomjs.org/download.html ) (หากคุณใช้งานบน Linux คำแนะนำต่อไปนี้จะช่วยhttps://stackoverflow.com/a/14267295/382630 )
  2. ติดตั้งซีลีเนียมโดยใช้ pip

ตอนนี้คุณสามารถใช้สิ่งนี้

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

driver.quit()

3
ขอบคุณเป็นพิเศษสำหรับการชี้ไปที่คำตอบดังนั้นเกี่ยวกับการติดตั้ง PhantomJS บน Ubuntu มันช่วยฉันได้
Dennis Golomazov

วิธีที่รวดเร็วในการติดตั้งซีลีเนียมที่ฉันเพิ่งเรียนรู้คือบน Windows ให้พิมพ์: C: \ Python34 \ Scripts \ pip.exe ติดตั้งซีลีเนียม
ntk4

8

นี่คือวิธีทดสอบ javascript โดยใช้ 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);
});

มือถือ / 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 และมันทำงาน :)
ใบปลิว

คุณเห็นไหมว่าข้อ จำกัด นี้ถูกต้อง? สิ่งที่คุณกำลังทำคือการโทรเปลือกในการดำเนินการ phantomjs - คุณไม่ได้จริงโดยใช้อินเตอร์เฟซที่ "เหมาะสม" ซึ่งคุณอย่างถูกต้องอาจจัดการกับข้อยกเว้นการบล็อก ฯลฯ
kamelkev

@kamelkev: ฉันเห็นว่ามันมี จำกัด ข้อเสียคือวิธีนี้ช่วยให้ฉันใช้คุณสมบัติการบูตของ Django เพื่อตั้งค่าฐานข้อมูลทดสอบด้วยเนื้อหาที่ถูกต้องสำหรับการทดสอบแต่ละครั้ง และอาจรวมกับคำตอบอื่น ๆ เพื่อให้ได้ประโยชน์สูงสุดจากทั้งสองโลก
Emil Stenström

6

คำตอบโดย @Pyklerดีมาก แต่ต้องการโหนดล้าสมัย ความคิดเห็นในคำตอบนั้นแนะนำคำตอบที่ง่ายกว่าซึ่งฉันได้ใส่ไว้ที่นี่เพื่อประหยัดเวลา:

  1. ติดตั้ง PhantomJS

    @ Vivin-Paliath ชี้ให้เห็นว่าเป็นโครงการแบบสแตนด์อโลนไม่ใช่ส่วนหนึ่งของโหนด

    Mac:

    brew install phantomjs

    อูบุนตู:

    sudo apt-get install phantomjs

    ฯลฯ

  2. ตั้งค่า a 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()

วิธีการติดตั้งPhantomJSบน windows? ดูเหมือนว่าจะไม่ทำงานโดยใช้pipคำสั่ง
นพ. Khairul Basar

1
Pip เป็นตัวติดตั้งแพ็กเกจหลามดังนั้นจึงทำงานร่วมกับซีลีเนียมซึ่งมีให้ใช้งานเป็นแพ็คเกจหลาม PhantomJS ไม่ใช่แพ็คเกจงูใหญ่ดังนั้นจะไม่ทำงานกับ pip ฉันทำ google อย่างรวดเร็วสำหรับ "PhantomJS ติดตั้ง windows" และมีเพลงยอดนิยม
Andrew 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()

ทำงานได้อย่างสมบูรณ์แบบ


ณ ตอนนี้แชนเนลเริ่มต้นไม่มี PhantomJS สำหรับ linux64
Eugene Pakhomov

ประณามฉันรัก conda <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/phantomjsงานซึ่งคุณสามารถโทรหา PhantomJS webdriver ด้วย (ในการติดตั้ง Selenium คุณต้องระบุในข้อกำหนดไข่หรือในการกำหนดค่า Buildout)

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

1
อีกวิธีหนึ่งในการติดตั้งโดยอัตโนมัติด้วย buildout เพียงแค่ใช้gp.recipe.phantomjsนั่นคือการกำหนดค่าphantomjsและcasperjs
gakhov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.