क्या पायथन में फैंटमज का उपयोग करने का कोई तरीका है?


203

मैं पायथन में फैंटमज का उपयोग करना चाहता हूं । मैंने इस समस्या को हल कर दिया, लेकिन उचित समाधान नहीं खोज सका।

मुझे लगता है os.popen() कि एक अच्छा विकल्प हो सकता है। लेकिन मैं इसके लिए कुछ तर्क नहीं दे पाया।

उपयोग करना subprocess.Popen()अब के लिए एक उचित समाधान हो सकता है। मैं जानना चाहता हूं कि कोई बेहतर उपाय है या नहीं।

क्या पायथन में फैंटमज का उपयोग करने का कोई तरीका है?


नीचे मेरा जवाब आपको बताता है कि यह कैसे करना है। बस अपने सवाल को देख रहे हैं और वास्तव में सेलेनियम क्या करता है, subprocess.popenलेकिन एपीआई को सहज बनाने के लिए कुछ विस्तारित सुविधाओं के साथ।
Pykler

@ क्रिस्टल: आपको संभवतः स्वीकृत उत्तर को बदलने पर विचार करना चाहिए, नीचे देखें। धन्यवाद।
डॉटनकोहेन

जवाबों:


373

अजगर में फैंटमज का उपयोग करने का सबसे आसान तरीका सेलेनियम है। सबसे सरल स्थापना विधि है

  1. NodeJS स्थापित करें
  2. नोड के पैकेज प्रबंधक का उपयोग करके प्रेत स्थापित करें: npm -g install phantomjs-prebuilt
  3. सेलेनियम स्थापित करें (अपने virtualenv में, यदि आप उस का उपयोग कर रहे हैं)

स्थापना के बाद, आप के रूप में सरल रूप में प्रेत का उपयोग कर सकते हैं:

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 मॉड्यूल" - npmjs.org/package/phantomjs पर npm आवरण को इस उद्देश्य के लिए व्यवहार करता है। मेरे मामले में मैं ऐसा करना चाहता था: bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML")और ... इसने काम किया!
MarkHu

8
मैं मानता हूं कि भूत की पागल निर्भरताएं हैं, और मैं वास्तव में लाखों एक्स 11 संबंधित पुस्तकालयों को स्थापित करने के बाद भी इसे पाने और चलाने में विफल रहा। भूत एक डरावनी कहानी है।
पाइकलर

5
@ प्रभात आपको प्रेतराज के प्रथम तर्क के रूप में प्रेतजाल तक जाने के लिए मार्ग की आवश्यकता है ... या प्रेतसमूह को देखने में सक्षम होने के लिए अपनी खिड़कियों के सिसपथ को ठीक करें।
पाइकलर

2
गूंगा प्रश्न: मुझे नोड-जेएस क्यों स्थापित करना है? वहाँ कोई दूसरा रास्ता नहीं है pahantomJs पाने के लिए?
इलदोसा

80

हाल ही में PhantomJS ने पायथन सपोर्ट को पूरी तरह से गिरा दिया । हालाँकि, PhantomJS अब घोस्ट ड्राइवर को एम्बेड करता है ।

शून्य को भरने के लिए एक नई परियोजना शुरू की गई है 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
यद्यपि समर्थन को गिरा दिया गया है, मैंने पाया कि एनपीएम (नोड पैकेज मैनेजर) स्थापित करना और इसका उपयोग नवीनतम फेंटमज (वेबड्राइवर समर्थन के साथ) स्थापित करने और अजगर में सेलेनियम स्थापित करने के लिए ... ठीक से काम करने के लिए PyTT या PySide प्राप्त करने की कोशिश करने की तुलना में आसान है। प्रेत के बारे में क्या अच्छा है यह वास्तव में बिना सिर के है और काम करने के लिए कोई यूआई / एक्स 11 से संबंधित काम करने की आवश्यकता नहीं है।
पाइकलर

12
मैंने भूत-प्रेत का उपयोग करने और अपने जीवन से घृणा करने के बाद अपना पसंदीदा समाधान बताते हुए नीचे एक उत्तर जोड़ा
Pykler

8
पाइकलर का "मेरे जीवन से नफरत करना" एक समझ नहीं है। यदि कोई इस प्रश्न के लिए "सही उत्तर" को बदल देता है तो पाइकलर के I ने एक दिन के प्रयास को बचाया होगा।
YPCrumble

2
@YPCrumble: दुर्भाग्य से, केवल ओपी ही ऐसा कर सकता है; स्वीकृत उत्तर को बदलें।
मार्टिन पीटर्स

3
आज सुबह विभिन्न दृष्टिकोणों के एक समूह की कोशिश करने के बाद, @ पाइक्लर समाधान ने सबसे सुचारू रूप से काम करना समाप्त कर दिया।
andyzinsser

40

अब जब से घोस्टड्राइवर फैंटमजस के साथ आया है, सेलेनियम के माध्यम से इसका उपयोग करना और भी सुविधाजनक हो गया है।

मैंने फैंकमेज़ की नोड स्थापना की कोशिश की, जैसा कि पाइकलर द्वारा सुझाया गया था, लेकिन व्यवहार में मैंने इसे फ़ैंटमज़ की स्टैंडअलोन स्थापना की तुलना में धीमा पाया। मुझे लगता है कि स्टैंडअलोन इंस्टॉलेशन ने इन सुविधाओं को पहले प्रदान नहीं किया था, लेकिन v1.9 के रूप में, यह बहुत कुछ ऐसा करता है।

  1. PhantomJS ( http://phantomjs.org/download.html ) स्थापित करें (यदि आप लिनक्स पर हैं, तो निम्नलिखित निर्देशों से https://stackoverflow.com/a/14267295/382630 मदद मिलेगी )
  2. पाइप का उपयोग करके सेलेनियम स्थापित करें।

अब आप इस तरह का उपयोग कर सकते हैं

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

driver.quit()

3
उबंटू पर फैंटमोज इंस्टालेशन से संबंधित एसओ उत्तर की ओर इशारा करने के लिए विशेष धन्यवाद, इसने मेरी मदद की।
डेनिस गोलोमेज़ोव

सेलेनियम को स्थापित करने का एक त्वरित तरीका जो मैंने अभी सीखा है, विंडोज पर है, टाइप करें: C: \ Python34 \ Scripts \ pip.exe सेलेनियम स्थापित करें।
ntk4

8

यहां बताया गया है कि मैं कैसे फैंटमज और Django का उपयोग करके जावास्क्रिप्ट का परीक्षण करता हूं:

मोबाइल / 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 स्क्रिप्ट कॉल करने के लिए और यह काम किया :)
उड़ता

आप देखते हैं कि यह कैसे सही है? आप जो भी कर रहे हैं, वह फैंटमज को निष्पादित करने के लिए एक शेल कॉल कर रहा है - आप वास्तव में एक "उचित" इंटरफ़ेस का उपयोग नहीं कर रहे हैं जिसके माध्यम से आप अपवादों को ठीक से रोक सकते हैं, अवरुद्ध कर सकते हैं, आदि
kamelkev

@kamelkev: मैं देखता हूं कि यह कैसे सीमित है। उल्टा यह है कि यह विधि मुझे प्रत्येक परीक्षण के लिए सही सामग्री के साथ एक परीक्षण डेटाबेस सेट करने के लिए Django के बूटस्ट्रैपिंग सुविधाओं का उपयोग करने की अनुमति देती है। और हाँ, इसे दोनों दुनिया के सर्वश्रेष्ठ पाने के लिए अन्य उत्तरों के साथ जोड़ा जा सकता है।
एमिल स्टेनस्ट्रॉम

6

@Pykler द्वारा जवाब महान है लेकिन नोड आवश्यकता पुरानी है। उस उत्तर में टिप्पणियाँ सरल उत्तर का सुझाव देती हैं, जो मैंने दूसरों के समय को बचाने के लिए यहां रखा है:

  1. PhantomJS स्थापित करें

    जैसा कि @ विविन-पालीथ बताते हैं, यह एक स्टैंडअलोन प्रोजेक्ट है, नॉड का हिस्सा नहीं।

    मैक:

    brew install phantomjs

    उबंटू:

    sudo apt-get install phantomjs

    आदि

  2. सेट अप करें virtualenv(यदि आप पहले से नहीं हैं):

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

    यदि आपकी मशीन में पायथन 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खिड़कियों पर कैसे स्थापित करें ? यह pipकमांड का उपयोग कर काम नहीं करता है ।
एमडी। खिरुल बसर

1
पिप एक अजगर पैकेज इंस्टॉलर है, इसलिए यह सेलेनियम के साथ काम करता है, जो कि अजगर पैकेज के रूप में उपलब्ध है। PhantomJS एक अजगर पैकेज नहीं है इसलिए पाइप के साथ काम नहीं करेगा। मैंने "PhantomJS install windows" के लिए एक त्वरित Google किया और अच्छी हिट्स हैं।
एंड्रयू ई

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

यदि एनाकोंडा का उपयोग कर रहे हैं, के साथ स्थापित करें:

conda install PhantomJS

आपकी स्क्रिप्ट में:

from selenium import webdriver
driver=webdriver.PhantomJS()

अच्छी तरह से काम।


अब तक, डिफॉल्ट चैनलों में linux64 के लिए PhantomJS शामिल नहीं है
Eugene Pakhomov

अरे, मैं कोंडा <3 प्यार करता था कि इतना आसान था। मैं osx पर हूँ।
O.rka

1

मामले में आप प्रयोग कर रहे हैं buildout , आप आसानी से कि Pykler का उपयोग कर का वर्णन स्थापना प्रक्रियाओं को स्वचालित कर सकते हैं gp.recipe.node नुस्खा।

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

वह हिस्सा नोड.जेएस को बाइनरी के रूप में स्थापित करता है (कम से कम मेरे सिस्टम पर) और फिर प्रेत का उपयोग करने के लिए npm का उपयोग करता है। अंत में यह एक एंट्री पॉइंट बनाता है bin/phantomjs, जिसे आप फैंटमजस वेबड्राइवर कह सकते हैं। (सेलेनियम को स्थापित करने के लिए, आपको इसे अपने अंडे की आवश्यकताओं या बिल्डआउट कॉन्फ़िगरेशन में निर्दिष्ट करने की आवश्यकता है।)

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

1
gp.recipe.phantomjsphantomjscasperjs
बिल्डआउट के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.