পাইথনে ফ্যান্টমজেএস ব্যবহার করার কোনও উপায় আছে কি?


203

আমি ব্যবহার করতে চান PhantomJS মধ্যে পাইথন । আমি এই সমস্যাটি গুগল করেছিলাম তবে সঠিক সমাধান খুঁজে পাইনি।

আমি os.popen() একটি ভাল পছন্দ হতে পারে। তবে আমি এটিতে কিছু যুক্তি দিতে পারিনি।

ব্যবহার subprocess.Popen()করা আপাতত একটি উপযুক্ত সমাধান হতে পারে। আমি আরও ভাল সমাধান আছে কি না তা জানতে চাই।

পাইথনে ফ্যান্টমজেএস ব্যবহার করার কোনও উপায় আছে কি?


নীচের আমার উত্তর আপনাকে কীভাবে এটি করতে হবে তা বলে। কেবল আপনার প্রশ্নের দিকে তাকিয়ে এবং আসলে সেলেনিয়াম যা করে তা ঠিকঠাক করে দেয়, subprocess.popenএপিআইকে নির্বিঘ্ন করতে কিছু বর্ধিত বৈশিষ্ট্য সহ।
পাইক্লার

@ ফ্লাইয়ার: আপনার সম্ভবত গ্রহণযোগ্য উত্তর পরিবর্তন করার কথা বিবেচনা করা উচিত, নীচে দেখুন। ধন্যবাদ.
dotancohen

উত্তর:


373

পাইথনে ফ্যান্টমজেএস ব্যবহারের সবচেয়ে সহজ উপায় হ'ল সেলেনিয়াম হয়ে। সহজ ইনস্টলেশন পদ্ধতিটি হ'ল

  1. নোডজেএস ইনস্টল করুন
  2. নোডের প্যাকেজ ম্যানেজারটি ফ্যান্টমজ ব্যবহার করুন: 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
এটি সুন্দরভাবে কাজ করে, এবং আমি আনন্দিতভাবে আশ্চর্য হয়েছি কারণ ফ্যান্টমজস.আর.এস.এফ.এইচটিএমএল বলেছে "নোড.জেএস মডিউল নয়" - এনটিএমজেজে.আর.পি / প্যাকেজ / ফিফটমজেসে এনপিএম র‌্যাপারটি এটি এই উদ্দেশ্যে আচরণ করে। আমার ক্ষেত্রে আমি এটি করতে চেয়েছিলাম: bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML")এবং ... এটি কাজ করেছে!
মার্কহু

8
আমি সম্মত হই যে ভূতের পাগল নির্ভরতা রয়েছে এবং লক্ষ লক্ষ এক্স 11 সম্পর্কিত লাইব্রেরি ইনস্টল করার পরেও আমি এটি পেতে এবং চালাতে ব্যর্থ হয়েছি। ভূত একটি হরর গল্প।
পাইক্লার

5
@ ফাফতার আপনাকে ফ্যান্টমজেএসের প্রথম যুক্তি হিসাবে ফ্যান্টমজে যাওয়ার পথটি পাস করতে হবে ... বা ফ্যান্টমজগুলি দেখতে সক্ষম হওয়ার জন্য আপনার উইন্ডোজ সিসপথটি ঠিক করতে হবে।
পাইক্লার

2
বোবা প্রশ্ন: কেন আমাকে নোড-জেএস ইনস্টল করতে হবে? পাঠানটমজেসের আর কোনও উপায় নেই?
ইল্ডোসা

80

ফ্যান্টমজেএস সম্প্রতি পাইথন সমর্থন পুরোপুরি বাদ দিয়েছে । তবে, ফ্যান্টমজেএস এখন ঘোস্ট ড্রাইভারকে এম্বেড করে ।

একটি নতুন প্রকল্প থেকে জোরদার করেছে শূন্যতা পূরণ করুন: 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
সমর্থন বাদ দেওয়া সত্ত্বেও, আমি দেখতে পেয়েছি যে এনপিএম ইনস্টল করা (নোড প্যাকেজ ম্যানেজার) এবং এটি সর্বশেষ ফ্যান্টমজ ইনস্টল করতে (ওয়েবড্রাইভার সমর্থন সহ) এবং পাইথনে সেলেনিয়াম ইনস্টল করার জন্য ... পাইকিউটি বা পাইসাইড সঠিকভাবে কাজ করার চেষ্টা করার চেয়ে সহজ উপায়। ভুতের কী সুন্দর তা সত্যিকার অর্থেই মাথাছাড়া এবং কাজ করার জন্য কোনও ইউআই / এক্স 11 সম্পর্কিত লিবসের প্রয়োজন নেই।
পাইকলার

12
ঘোস্ট.পি ব্যবহার করার চেষ্টা করার পরে এবং আমার জীবনকে ঘৃণা করার পরে আমি আমার পছন্দের সমাধানটি ব্যাখ্যা করার জন্য নীচে একটি উত্তর যুক্ত করেছি
পাইক্লার

8
পাইক্লারের "আমার জীবনকে ঘৃণা করা" কোনও সংক্ষেপণ নয়। যদি কেউ এই প্রশ্নের জন্য "সঠিক উত্তর" পাইক্লারের কাছে পরিবর্তন করত তবে আমি এক দিনের প্রচেষ্টা বাঁচাতে পারতাম।
ওয়াইপ্রেম্বল

2
@ ওয়াইপি ক্রাম্বেল: দুর্ভাগ্যক্রমে, কেবল ওপিই এটি করতে পারে; গৃহীত উত্তর পরিবর্তন করুন।
মার্টিজন পিটারস

3
আজ সকালে বিভিন্ন পদ্ধতির একগুচ্ছ চেষ্টা করার পরে, @ পাইক্লার সলিউশনটি স্মুটেস্টের কাজ শেষ করে।
andyzinsser

40

এখন যেহেতু ঘোস্টড্রাইভার ফ্যান্টমজেএস এর সাথে একত্রিত হয়েছে, সেলেনিয়ামের মাধ্যমে এটি ব্যবহার করা আরও বেশি সুবিধাজনক হয়ে উঠেছে।

পাইক্লারের পরামর্শ অনুসারে আমি ফ্যান্টমজেএস-এর নোড ইনস্টলেশন করার চেষ্টা করেছি, তবে বাস্তবে আমি এটি ফ্যান্টমজেএসের স্ট্যান্ডেলোন ইনস্টলেশন থেকে ধীর বলে মনে করেছি। আমার ধারণা, একক ইনস্টলেশনটি আগে এই বৈশিষ্ট্যগুলি সরবরাহ করে নি, তবে ভি 1.9 হিসাবে এটি খুব বেশি করে।

  1. ফ্যান্টমজেএস ইনস্টল করুন ( 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
উবুন্টুতে ফ্যান্টমজেএস ইনস্টলেশন সম্পর্কিত এসও উত্তরের দিকে ইঙ্গিত করার জন্য বিশেষ ধন্যবাদ, এটি আমাকে সহায়তা করেছিল।
ডেনিস গোলোমাজভ

সবেমাত্র সেলেনিয়ামটি ইনস্টল করার একটি দ্রুত উপায় হ'ল উইন্ডোজে, টাইপ করুন: সি: \ পাইথন 34 \ স্ক্রিপ্টগুলি \ পিপ.এক্সে সেলেনিয়াম ইনস্টল করুন।
ntk4

8

আমি কীভাবে ফ্যান্টমজেএস এবং জাঙ্গো ব্যবহার করে জাভাস্ক্রিপ্ট পরীক্ষা করি:

মোবাইল / টেস্ট_নো_জেএস_রফেস.জেএস :

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);
});

মোবাইল / টেস্ট.পি :

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


ধন্যবাদ। আমি সাবপ্রসেস.পোপেনটি ফ্যান্টমজ স্ক্রিপ্ট কল করতে ব্যবহার করেছি এবং এটি কাজ করেছে :)
ফ্লায়ার

আপনি দেখতে পাচ্ছেন যে এটি কীভাবে সীমাবদ্ধ? ফ্যান্টমজগুলি কার্যকর করার জন্য আপনি যা করছেন তা সবই করছে - আপনি আসলে "যথাযথ" ইন্টারফেস ব্যবহার করছেন না যার মাধ্যমে আপনি ব্যতিক্রমগুলি, ব্লকিং ইত্যাদি সঠিকভাবে পরিচালনা করতে পারেন
কামেলকেশ

@ কামেলকেভ: আমি দেখছি এটি কীভাবে সীমাবদ্ধ। উল্টোটি এই পদ্ধতিটি আমাকে জঙ্গোর বুটস্ট্র্যাপিং বৈশিষ্ট্যগুলি প্রতিটি পরীক্ষার জন্য সঠিক সামগ্রী সহ একটি পরীক্ষামূলক ডাটাবেস সেট আপ করতে অনুমতি দেয় allows এবং হ্যাঁ, এটি উভয় বিশ্বের সেরা পাওয়ার জন্য অন্যান্য উত্তরের সাথে একত্রিত হতে পারে।
এমিল স্টেনস্ট্রোম

6

@Pykler দ্বারা উত্তর মহান কিন্তু নোড প্রয়োজন পুরানো হয়েছে। এই উত্তরের মন্তব্যগুলি সহজ উত্তরটির পরামর্শ দেয়, যা আমি অন্যের সময় বাঁচাতে এখানে রেখেছি:

  1. ফ্যান্টমজেএস ইনস্টল করুন

    @ ভিভিন-পালিথ যেমন উল্লেখ করেছেন, এটি নোডের অংশ নয়, একটি স্বতন্ত্র প্রকল্প project

    ম্যাক:

    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
পিপ একটি পাইথন প্যাকেজ ইনস্টলার, সুতরাং এটি সেলেনিয়ামের সাথে কাজ করে যা পাইথন প্যাকেজ হিসাবে উপলব্ধ। ফ্যান্টমজেএস পাইথন প্যাকেজ নয় তাই পাইপের সাথে কাজ করবে না। আমি "ফ্যান্টমজেএস ইনস্টল উইন্ডো" এর জন্য একটি দ্রুত গুগল করেছি এবং এখানে বেশ ভাল হিট রয়েছে।
অ্যান্ড্রু ই

5

এটি আমি কি, অজগর 3.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()

পুরোপুরি কাজ করে।


এখন পর্যন্ত, ডিফল্ট চ্যানেলগুলিতে ফ্যান্টমজেএস লিনাক্স 64 নেই
ইউজিন

অভিশাপ, আমি কনডা <3 পছন্দ করি যা এত সহজ ছিল। আমি ওক্সে আছি
ওআরকা

1

আপনি বিল্ডআউট ব্যবহার করছেন এমন ক্ষেত্রে , আপনি সহজেই জিপি.রেসিপ.নোড রেসিপিটি ব্যবহার করে পাইকলার যে ইনস্টলেশন প্রক্রিয়া বর্ণনা করেছেন তা সহজেই স্বয়ংক্রিয় করতে পারেন ।

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

সেই অংশটি নোড.জেএস বাইনারি হিসাবে অন্তত ইনস্টল করে (কমপক্ষে আমার সিস্টেমে) এবং তারপরে ফ্যান্টমজেএস ইনস্টল করতে এনপিএম ব্যবহার করে। অবশেষে এটি একটি এন্ট্রি পয়েন্ট তৈরি করে bin/phantomjs, যা দিয়ে আপনি ফ্যান্টমজেএস ওয়েবড্রাইভারকে কল করতে পারেন। (সেলেনিয়াম ইনস্টল করতে, আপনাকে এটি আপনার ডিমের প্রয়োজনে বা বিল্ডআউট কনফিগারেশনে নির্দিষ্ট করা দরকার))

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

1
বিল্ডআউটের সাথে ইনস্টলেশন প্রক্রিয়াটি স্বয়ংক্রিয় করার আরেকটি উপায় এটি কেবল ব্যবহারের জন্য gp.recipe.phantomjs, যা কনফিগার করে phantomjsএবংcasperjs
গাখভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.