2015-02-10 15 views
5

तो मैं अपने वेबड्राइवर के अंदर नए टैब पर वेबसाइट खोलने की कोशिश कर रहा हूं। मैं ऐसा करना चाहता हूं, क्योंकि प्रत्येक वेबसाइट के लिए एक नया वेबड्राइवर खोलना फ़ैंटॉमजेएस का उपयोग करके लगभग 3.5secs लेता है, मुझे और गति चाहिए ...नए टैब में वेब खोलें सेलेनियम + पायथन

मैं एक मल्टीप्रोसेस पायथन स्क्रिप्ट का उपयोग कर रहा हूं, और मैं प्रत्येक से कुछ तत्व प्राप्त करना चाहता हूं पेज, इसलिए कार्यप्रवाह इस तरह है:

Open Browser 

Loop throught my array 
For element in array -> Open website in new tab -> do my business -> close it 

लेकिन मैं इस लक्ष्य को हासिल करने के लिए किसी भी तरह से नहीं मिल रहा।

यहां कोड है जिसका मैं उपयोग कर रहा हूं। यह वेबसाइटों के बीच हमेशा के लिए लेता है, मुझे इसे तेज़ होने की आवश्यकता है ... अन्य टूल्स की अनुमति है, लेकिन मुझे जावास्क्रिप्ट के साथ लोड होने वाली वेबसाइट सामग्री को स्क्रैप करने के लिए बहुत सारे टूल नहीं हैं (जब कुछ ईवेंट लोड पर ट्रिगर होता है तो डिवीज बनाया जाता है) मुझे सेलेनियम की आवश्यकता क्यों है ... मेरे कुछ पृष्ठों के लिए सुंदर सूप का उपयोग नहीं किया जा सकता है।

#!/usr/bin/env python 
import multiprocessing, time, pika, json, traceback, logging, sys, os, itertools, urllib, urllib2, cStringIO, mysql.connector, shutil, hashlib, socket, urllib2, re 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from PIL import Image 
from os import listdir 
from os.path import isfile, join 
from bs4 import BeautifulSoup 
from pprint import pprint 

def getPhantomData(parameters): 
    try: 
     # We create WebDriver 
     browser = webdriver.Firefox() 
     # Navigate to URL 
     browser.get(parameters['target_url']) 
     # Find all links by Selector 
     links = browser.find_elements_by_css_selector(parameters['selector']) 

     result = [] 
     for link in links: 
      # Extract link attribute and append to our list 
      result.append(link.get_attribute(parameters['attribute'])) 
     browser.close() 
     browser.quit() 
     return json.dumps({'data': result}) 
    except Exception, err: 
     browser.close() 
     browser.quit() 
     print err 

def callback(ch, method, properties, body): 
    parameters = json.loads(body) 
    message = getPhantomData(parameters) 

    if message['data']: 
     ch.basic_ack(delivery_tag=method.delivery_tag) 
    else: 
     ch.basic_reject(delivery_tag=method.delivery_tag, requeue=True) 

def consume(): 
    credentials = pika.PlainCredentials('invitado', 'invitado') 
    rabbit = pika.ConnectionParameters('localhost',5672,'/',credentials) 
    connection = pika.BlockingConnection(rabbit) 
    channel = connection.channel() 

    # Conectamos al canal 
    channel.queue_declare(queue='com.stuff.images', durable=True) 
    channel.basic_consume(callback,queue='com.stuff.images') 

    print ' [*] Waiting for messages. To exit press CTRL^C' 
    try: 
     channel.start_consuming() 
    except KeyboardInterrupt: 
     pass 

workers = 5 
pool = multiprocessing.Pool(processes=workers) 
for i in xrange(0, workers): 
    pool.apply_async(consume) 

try: 
    while True: 
     continue 
except KeyboardInterrupt: 
    print ' [*] Exiting...' 
    pool.terminate() 
    pool.join() 
+0

शुरुआत में सभी वेबड्राइवर बनाने के बारे में क्या? – Raito

उत्तर

17

आप कुंजी COMMAND + T या COMMAND + W (OSX) के संयोजन द्वारा एक टैब के उद्घाटन/समापन प्राप्त कर सकते हैं। अन्य SO पर आप CONTROL + T/CONTROL + W का उपयोग कर सकते हैं।

सेलेनियम में आप इस तरह के व्यवहार का अनुकरण कर सकते हैं। आपको एक वेबड्राइवर और जितनी टेब की आवश्यकता है उतने टैब बनाने की आवश्यकता होगी।

यहां यह कोड है। सेलेनियम वेबसाइट पर परिभाषा पर

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Firefox() 
driver.get("http://www.google.com/") 

#open tab 
driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 't') 

# Load a page 
driver.get('http://stackoverflow.com/') 
# Make the tests... 

# close the tab 
driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 'w') 
driver.close() 
+0

लेकिन मेरे पास मल्टीप्रोसेस है, इसलिए, मेरे पास 10 एक साथ नौकरियां हैं, जो प्रत्येक पृष्ठ में डेटा तक पहुंचना चाहते हैं, ऐसा करने के लिए मैंने कोशिश की है (मैंने कोशिश की है) कई टैब खोल दिए गए हैं, लेकिन केवल एक ही तत्व ढूंढ रहे हैं और व्यवसाय कर रहे हैं –

+0

क्षमा करें मैं करता हूं अपना बयान नहीं मिला। आप सवाल थे "सरणी में तत्व के लिए -> नए टैब में वेबसाइट खोलें -> मेरा व्यवसाय करें -> इसे बंद करें"। तो प्रस्तावित समाधान ने इसका जवाब देने की कोशिश की।क्या आप वास्तव में स्पष्ट कर सकते हैं कि आप क्या खोज रहे हैं? क्या आप सुनिश्चित हैं कि वेबड्राइवर आपके लिए सही उपकरण है? स्केपर के बारे में क्या? – aberna

+0

मैं जो कर रहा हूं वह एन श्रमिकों (इस मामले में 10) बना रहा है, इन श्रमिकों में से प्रत्येक को एक यूआरएल खोलने की जरूरत है, फिर उस यूआरएल पर कुछ सामान स्क्रैप करें, मुख्य समस्या यह है कि यह बेहद धीमी है क्योंकि इसे एक नया वेबड्राइवर खोलने की जरूरत है प्रत्येक पुनरावृत्ति पर, प्रत्येक के लिए इसे लगभग 4 सेकंड की आवश्यकता होती है। मुझे लगता है कि यह मेरे लिए सही उपकरण है क्योंकि वेबसाइट पर कुछ छवियों को लोड किया गया है जो केवल तब लोड होते हैं जब जावास्क्रिप्ट लोड हो जाता है, अन्यथा तत्वों को नहीं बनाया जाएगा, और निश्चित रूप से –

0

आधार: जाहिर है, यह परीक्षण प्रयोजनों के लिए वेब अनुप्रयोगों को स्वचालित के लिए है, लेकिन निश्चित रूप से सिर्फ इतना है कि करने के लिए सीमित नहीं है। उबाऊ वेब-आधारित प्रशासनिक कार्य भी (और चाहिए!) भी स्वचालित हो सकते हैं। आप देखते हैं कि सेलेनियम का मुख्य लक्ष्य परीक्षण उद्देश्यों के लिए है और इसके अलावा आप प्रशासनिक कार्यों को स्वचालित कर सकते हैं जो वेबसाइटों को क्रॉल नहीं करते हैं। क्रॉलिंग उद्देश्यों के लिए ऐसी चीज के साथ काम करना बस समय की बर्बादी है मुझे लगता है कि आपको क्रॉलिंग के लिए ध्यान देना चाहिए, http://scrapy.org पर एक नज़र डालें वेबसाइटों से डेटा लाने के लिए यह पाइथन में सबसे आम रूपरेखा है।

4
browser.execute_script('''window.open("http://bings.com","_blank");''') 

कहाँ ब्राउज़रwebDriver

+0

कुछ कारण यह अकेला था जो मेरे लिए काम करता था। धन्यवाद! – Mangohero1

0

है इतने लंबे समय के नीचे दी गई विधि के लिए संघर्ष करने के बाद मेरे लिए काम किया:

driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't') 
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB) 

windows = driver.window_handles 

time.sleep(3) 
driver.switch_to.window(windows[1]) 
+0

क्या आपने हाल के संस्करणों के साथ इसका परीक्षण किया है? यह मेरे लिए काम नहीं करता है। मुझे लगता है कि आपके मामले में आप किसी कारण से फोकस खो चुके हैं। – yucer

5

यह एक आम कोड एक और उदाहरण से अनुकूलित है:

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Firefox() 
driver.get("http://www.google.com/") 

#open tab 
# ... take the code from the options below 

# Load a page 
driver.get('http://bings.com') 
# Make the tests... 

# close the tab 
driver.quit() 

संभव तरीके थे:

  1. एक तत्व

    #open tab 
    driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't') 
    
  2. करने के लिए भेजा जा रहा है <CTRL> + <T> कार्रवाई चेन के माध्यम से भेजा जा रहा है <CTRL> + <T>

    ActionChains(driver).key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform() 
    
  3. एक जावास्क्रिप्ट टुकड़ा

    driver.execute_script('''window.open("http://bings.com","_blank");''') 
    
    निष्पादित

    इसे प्राप्त करने के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि प्राथमिकताएं browser.link.open_newwindow और browser.link.open_newwindow.restriction ठीक से सेट हैं। पिछले संस्करणों में डिफ़ॉल्ट मान, ठीक है अन्यथा आप माना जाता है कि जरूरत है:

    fp = webdriver.FirefoxProfile() 
    fp.set_preference("browser.link.open_newwindow", 3) 
    fp.set_preference("browser.link.open_newwindow.restriction", 2) 
    
    driver = webdriver.Firefox(browser_profile=fp) 
    

    समस्या यह है कि उन प्राथमिकताओं other values को पूर्व निर्धारित और जमे हुए कम से कम सेलेनियम 3.4.0 हो रहा है। जब आप जावा बाध्यकारी के साथ सेट करने के लिए प्रोफ़ाइल का उपयोग करते हैं तो वहां exception आता है और नए मानों को बाध्य करने वाले पायथन के साथ अनदेखा किया जाता है।

    जावा में एक प्रोफ़ाइल ऑब्जेक्ट को निर्दिष्ट जब geckodriver से बात कर के बिना उन प्राथमिकताओं को सेट करने के लिए एक रास्ता है, लेकिन यह बाध्यकारी अजगर में अभी तक लागू नहीं हो रहे हैं:

    FirefoxOptions options = new FirefoxOptions().setProfile(fp); 
    options.addPreference("browser.link.open_newwindow", 3); 
    options.addPreference("browser.link.open_newwindow.restriction", 2); 
    FirefoxDriver driver = new FirefoxDriver(options); 
    

सेलेनियम 3.4.0 में पायथन के लिए तीसरा विकल्प stop working था।

पहले दो विकल्प सेलेनियम 3.4.0 में stop working प्रतीत होता है। वे एक तत्व में CTRL कुंजी ईवेंट भेजने पर निर्भर करते हैं। पहली नज़र में ऐसा लगता है कि CTRL कुंजी की समस्या है, लेकिन यह नए multiprocess feature of Firefox की वजह से विफल रहा है। ऐसा हो सकता है कि यह नया आर्किटेक्चर ऐसा करने के नए तरीकों को लगाए, या शायद एक अस्थायी कार्यान्वयन समस्या है। वैसे भी हम इसे अक्षम कर सकते हैं:

fp = webdriver.FirefoxProfile() 
fp.set_preference("browser.tabs.remote.autostart", False) 
fp.set_preference("browser.tabs.remote.autostart.1", False) 
fp.set_preference("browser.tabs.remote.autostart.2", False) 

driver = webdriver.Firefox(browser_profile=fp) 

... और फिर आप सफलतापूर्वक पहले तरीके से उपयोग कर सकते हैं।

+0

यह आदेश वास्तव में काम किया !! – Sandeep

संबंधित मुद्दे