Python'da PhantomJS kullanmanın bir yolu var mı?


203

Kullanmak istediğim PhantomJS içinde Python . Bu sorunu araştırdım, ancak uygun çözümler bulamadım.

Ben bulmak os.popen() iyi bir seçim olabilir. Ama bazı argümanları aktaramadım.

Kullanmak subprocess.Popen()şimdilik uygun bir çözüm olabilir. Daha iyi bir çözüm olup olmadığını bilmek istiyorum.

Python'da PhantomJS kullanmanın bir yolu var mı?


Aşağıdaki cevabım bunu nasıl yapacağınızı anlatıyor. Sadece sorunuza bakarak ve aslında Selenium'un yaptığı tam olarak budur, subprocess.popenancak api'yi sorunsuz hale getirmek için bazı genişletilmiş özelliklere sahiptir.
Pykler

@flyer: Muhtemelen kabul edilen cevabı değiştirmeyi düşünmelisiniz, aşağıya bakınız. Teşekkür ederim.
dotancohen

Yanıtlar:


373

PhantomJS'yi python'da kullanmanın en kolay yolu Selenyum'dur. En basit kurulum yöntemi

  1. yükleme NodeJS
  2. Düğümün paket yöneticisini kullanarak phantomjs yükleyin: npm -g install phantomjs-prebuilt
  3. selenyum yükleyin (eğer kullanıyorsanız sanalenvinizde)

Kurulumdan sonra, fantomu şu kadar basit kullanabilirsiniz:

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()

Sistem yolu ortam değişkeniniz doğru ayarlanmamışsa, tam yolu bağımsız değişken olarak belirtmeniz gerekir webdriver.PhantomJS(). Bunu değiştirin:

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

... Takip ederek:

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

Referanslar:


40
Bu güzel çalıştı ve muhtemelen günlerimi kurtardı. Teşekkür ederim. Biri tüm oluşturulan sayfayı kaynak olarak geri istiyorsa, odur driver.page_source.
scharfmn

4
Bu güzel çalışıyor ve hoş bir sürpriz oldu çünkü phantomjs.org/faq.html "bir Node.js modülü değil" diyor - npmjs.org/package/phantomjs adresindeki npm sarmalayıcısı bu amaçla çalışıyor. Benim durumumda bunu yapmak istedim: bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML")ve ... işe yaradı!
MarkHu

8
Hayaletin çılgınca bağımlılıkları olduğunu kabul ediyorum ve aslında milyonlarca X11 ile ilgili kütüphaneyi kurduktan sonra bile çalıştıramadım. Hayalet bir korku hikayesidir.
Pykler

5
@phabtar PhantomJS için ilk argüman olarak phantomjs yolunu geçmeniz veya phantomjs'leri görebilmek için windows sisteminizi düzeltmeniz gerekir.
Pykler

2
Aptalca bir soru: node-js'i neden kurmam gerekiyor? pahantomJ almak için başka yolu yok mu?
15'te Eildosa

80

PhantomJS kısa süre önce Python desteğini tamamen bıraktı. Ancak, PhantomJS artık Ghost Driver'ı yerleştiriyor .

Yeni bir proje beri geçersiz doldurmak için hızlandırdı: ghost.py. Muhtemelen bunun yerine kullanmak istersiniz:

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
Destek bırakılsa da, npm (düğüm paketi yöneticisi) kurmanın ve en son phantomjs'leri (webdriver desteği ile) yüklemek ve python'a selenyum kurmanın ... PyQT veya PySide'ın düzgün çalışmasını sağlamaktan daha kolay olduğunu gördüm. Fantom hakkında güzel olan şey gerçekten başsızdır ve çalışmak için UI / X11 ile ilgili hiçbir kütüphaneye ihtiyaç duymaz.
Pykler

12
Hayalet.py'yi kullanmaya ve hayatımdan nefret etmeye çalıştıktan sonra tercih ettiğim çözümü açıklayan bir cevap ekledim
Pykler

8
Pykler'in "hayatımdan nefret ediyor" ifadesi yetersiz bir ifade değil. Birisi bu sorunun "doğru cevabını" Pykler'a değiştirirse, bir günlük çabayı kurtarırdım.
YPCrumble

2
@YPCrumble: ne yazık ki, sadece OP bunu yapabilir; kabul edilen cevabı değiştir.
Martijn Pieters

3
Bu sabah bir dizi farklı yaklaşımı denedikten sonra @Pykler çözümü en düzgün çalışmayı tamamladı.
andyzinsser

40

GhostDriver, PhantomJS ile birlikte geldiğinden, Selenium aracılığıyla kullanmak daha da kolaylaştı.

Pykler tarafından önerildiği gibi PhantomJS Düğüm kurulumunu denedim, ancak pratikte PhantomJS'nin bağımsız kurulumundan daha yavaş olduğunu gördüm. Tek başına kurulum bu özellikleri daha önce sağlamadı, ancak v1.9'dan itibaren bunu çok yapıyor.

  1. PhantomJS'yi yükleyin ( http://phantomjs.org/download.html ) (Linux'taysanız, aşağıdaki talimatlar https://stackoverflow.com/a/14267295/382630 adresine yardımcı olacaktır )
  2. Pip kullanarak Selenyum yükleyin.

Şimdi böyle kullanabilirsiniz

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

driver.quit()

3
Ubuntu üzerinde PhantomJS kurulumu ile ilgili SO cevabına işaret ettiğiniz için özel teşekkürler, bana yardımcı oldu.
Dennis Golomazov

Az önce öğrendiğim Selenium'u kurmanın hızlı bir yolu Windows'ta şunu yazın: C: \ Python34 \ Scripts \ pip.exe install Selenium.
ntk4

8

Javtomcript PhantomJS ve Django kullanarak nasıl test:

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

Testleri çalıştırın :

manage.py test mobile


Teşekkürler. Ben kullanılan subprocess.Popen phantomjs komut aramak ve onu :) çalıştı
el ilanı

Bunun nasıl sınırlı olduğunu görüyor musunuz? Yapıyorsun Tüm phantomjs yürütmek için bir kabuk görüşmesi yapıyor - engelleme, düzgün istisnalar işlemek geçebileceği aslında bir "doğru" arayüzünü kullanmıyorsanız, vb
kamelkev

@kamelkev: Bunun nasıl sınırlı olduğunu görüyorum. Bunun tersi, bu yöntemin, her test için doğru içeriğe sahip bir test veritabanı kurmak için Django'nun önyükleme özelliklerini kullanmamı sağlamasıdır. Ve evet, her iki dünyanın da en iyisini elde etmek için diğer cevaplarla birleştirilebilir.
Emil Stenström

6

@Pykler tarafından cevap harika ama Düğüm gereksinimi modası geçmiş. Bu yanıttaki yorumlar, başkalarına zaman kazanmak için buraya koyduğum daha basit bir cevap önerir:

  1. PhantomJS yükleyin

    @ Vivin-Paliath'ın belirttiği gibi, bu Node'nin bir parçası değil, bağımsız bir projedir.

    Mac:

    brew install phantomjs

    Ubuntu:

    sudo apt-get install phantomjs

    vb

  2. Ayarlayın virtualenv(henüz yapmadıysanız):

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

    Makinenizde hem Python 2 hem de 3 varsa, çalıştırma virtualenv-3.6 mypyveya benzeri bir şeye ihtiyacınız olabilir .

  3. Selenyum yükleyin:

    pip install selenium
  4. Dokümanlardan ödünç alındığı gibi basit bir test deneyin :

    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'a nasıl kurulur ? pipKomut kullanarak çalışmıyor gibi görünüyor .
MD. Khairul Basar

1
Pip bir python paketi yükleyicisidir, bu nedenle bir python paketi olarak bulunan selenyum ile çalışır. PhantomJS bir python paketi değildir, bu yüzden pip ile çalışmaz. "PhantomJS yükleme pencereleri" için hızlı bir google yaptım ve iyi hit vardır.
Andrew E

5

yaptığım şey bu, python3.3. Çok sayıda site listesini işliyordum, bu yüzden zaman aşımı başarısızlığı işin tüm liste boyunca çalışması için hayati önem taşıyordu.

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')

Teşekkürler, amacım için tadı değiştirebildim.
iChux

5

Anaconda kullanıyorsanız, aşağıdakileri yükleyin:

conda install PhantomJS

senaryonuzda:

from selenium import webdriver
driver=webdriver.PhantomJS()

Mükemmel çalışıyor.


Şimdilik, varsayılan kanallar linux64 için PhantomJS içermiyor
Eugene Pakhomov

lanet olsun, ben çok kolay conda <3 seviyorum. Ben osxtayım.
O.rka

1

Kullandığınız durumda kurulumları sona kolayca Pykler kullanarak tarif ettiği montaj işlemlerini otomatik hale getirebilirsiniz gp.recipe.node tarifi.

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

Bu bölüm node.js dosyasını ikili (en azından sistemime) olarak yükler ve ardından PhantomJS'yi yüklemek için npm'yi kullanır. Son olarak bin/phantomjs, PhantomJS web sürücüsünü çağırabileceğiniz bir giriş noktası oluşturur . (Selenium'u kurmak için yumurta gereksinimlerinizde veya Buildout yapılandırmasında belirtmeniz gerekir.)

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

1
kurulum işlemini otomatik olarak gp.recipe.phantomjsyapılandırmak phantomjsve yapılandırmak için başka bir yol yapılandırır vecasperjs
gakhov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.