पायथन में एक प्रॉक्सी के साथ सेलेनियम वेबड्राइवर चलाना


85

मैं कुछ बुनियादी कार्यों को करने के लिए पायथन में सेलेनियम वेबड्राइवर स्क्रिप्ट चलाने की कोशिश कर रहा हूं। मैं सेलेनियम आईडीई पूर्णांक के माध्यम से इसे चलाने के दौरान रोबोट को पूरी तरह से काम करने के लिए प्राप्त कर सकता हूं (यानी: जब बस अपने कार्यों को दोहराने के लिए जीयूआई मिल रहा है)। हालाँकि जब मैं कोड को पायथन स्क्रिप्ट के रूप में निर्यात करता हूं और कमांड लाइन से इसे निष्पादित करने का प्रयास करता हूं, तो फ़ायरफ़ॉक्स ब्राउज़र खुल जाएगा लेकिन कभी भी आरंभिक URL तक नहीं पहुंच सकता (कमांड लाइन में एक त्रुटि वापस आ जाती है और प्रोग्राम बंद हो जाता है)। यह मुझे इस बात की परवाह किए बिना हो रहा है कि मैं किस वेबसाइट आदि का उपयोग करने की कोशिश कर रहा हूं।

मैंने प्रदर्शन उद्देश्यों के लिए एक बहुत ही बुनियादी कोड को यहाँ शामिल किया है। मुझे नहीं लगता कि मैंने कोड के प्रॉक्सी सेक्शन को सही तरीके से शामिल किया है क्योंकि वापस की जा रही त्रुटि प्रॉक्सी द्वारा उत्पन्न होती है।

किसी भी सहायता की बेहद सराहना की जाएगी।

नीचे दिया गया कोड केवल www.google.ie को खोलने और "सेलेनियम" शब्द को खोजने के लिए है। मेरे लिए यह एक खाली फ़ायरफ़ॉक्स ब्राउज़र खोलता है और बंद हो जाता है।

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re
from selenium.webdriver.common.proxy import *

class Testrobot2(unittest.TestCase):
    def setUp(self):

        myProxy = "http://149.215.113.110:70"

        proxy = Proxy({
        'proxyType': ProxyType.MANUAL,
        'httpProxy': myProxy,
        'ftpProxy': myProxy,
        'sslProxy': myProxy,
        'noProxy':''})

        self.driver = webdriver.Firefox(proxy=proxy)
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.google.ie/"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_robot2(self):
        driver = self.driver
        driver.get(self.base_url + "/#gs_rn=17&gs_ri=psy-ab&suggest=p&cp=6&gs_id=ix&xhr=t&q=selenium&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=seleni&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.47883778,d.ZGU&fp=7c0d9024de9ac6ab&biw=592&bih=665")
        driver.find_element_by_id("gbqfq").clear()
        driver.find_element_by_id("gbqfq").send_keys("selenium")

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

जवाबों:


41

मेरे लिए इस तरह से काम करता है (@Amey और @ user4642224 कोड के समान, लेकिन थोड़ा छोटा):

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

prox = Proxy()
prox.proxy_type = ProxyType.MANUAL
prox.http_proxy = "ip_addr:port"
prox.socks_proxy = "ip_addr:port"
prox.ssl_proxy = "ip_addr:port"

capabilities = webdriver.DesiredCapabilities.CHROME
prox.add_to_capabilities(capabilities)

driver = webdriver.Chrome(desired_capabilities=capabilities)

2
यह काम करता है, धन्यवाद। अजीब बात है कि डॉक्स कहते हैं कि आपको रिमोट ड्राइवर का उपयोग करने की आवश्यकता है।
मैंस

ड्राइवर = webdriver.Firefox (वांछित_केबिलिटीज = क्षमताएं) टाइप करें: __init __ () को एक अनपेक्षित कीवर्ड तर्क 'वांछित_प्राप्तियां' क्यों मिलीं?
रिमो

33

इस जैसे किसी और के बारे में क्या राय है

PROXY = "149.215.113.110:70"

webdriver.DesiredCapabilities.FIREFOX['proxy'] = {
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":None,
    "proxyType":"MANUAL",
    "class":"org.openqa.selenium.Proxy",
    "autodetect":False
}

# you have to use remote, otherwise you'll have to code it yourself in python to 
driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.FIREFOX)

आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं ।


इस जवाब ने मेरे लिए अच्छा काम किया। यदि कोई अन्य व्यक्ति एज के साथ ऐसा करने का प्रयास कर रहा है, तो webdriver.DesiredCapabilities.EDGE['proxy']इसका कोई प्रभाव नहीं पड़ता है क्योंकि Microsoft एज में वर्तमान में प्रॉक्सी सर्वर को कॉन्फ़िगर करने के लिए सेटिंग नहीं है (एक प्रॉक्सी के साथ एज का उपयोग करने के लिए, आपको विंडोज नेटवर्क कनेक्शन सेटिंग्स के तहत प्रॉक्सी को कॉन्फ़िगर करना होगा) ।
स्टीव एचएचएच

1
पूर्ण विस्तृत दस्तावेज़ के लिए, देखें: github.com/SeleniumHQ/selenium/wiki/…
LeckieNi

15

मेरा समाधान:

def my_proxy(PROXY_HOST,PROXY_PORT):
        fp = webdriver.FirefoxProfile()
        # Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5
        print PROXY_PORT
        print PROXY_HOST
        fp.set_preference("network.proxy.type", 1)
        fp.set_preference("network.proxy.http",PROXY_HOST)
        fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
        fp.set_preference("general.useragent.override","whater_useragent")
        fp.update_preferences()
        return webdriver.Firefox(firefox_profile=fp)

फिर अपने कोड में कॉल करें:

my_proxy(PROXY_HOST,PROXY_PORT)

मेरे पास इस कोड के साथ समस्या थी क्योंकि मैं एक स्ट्रिंग को पोर्ट # के रूप में पारित कर रहा था:

 PROXY_PORT="31280"

यह महत्वपूर्ण है:

int("31280")

आपको एक स्ट्रिंग के बजाय एक पूर्णांक पास करना होगा या आपका फ़ायरफ़ॉक्स प्रोफ़ाइल ठीक से पोर्ट पर सेट नहीं होगा और प्रॉक्सी के माध्यम से कनेक्शन काम नहीं करेगा।


1
पोर्ट को इंट में बदलना होगा? यह आधिकारिक पेज पर फ़ायरफ़ॉक्स प्रॉक्सी उदाहरण को गलत बना देगा: seleniumhq.org/docs/04_webdriver_advanced.jsp उनके उदाहरण में, PROXYHOST: PROXYPORT को एक स्ट्रिंग के रूप में पारित किया गया है।
पाइडरमैन

@Pyderman, आप Proxy()क्लास को FirefoxProfile()क्लास के साथ भ्रमित कर रहे हैं । प्रोफ़ाइल वरीयताओं का उपयोग करके आपको अलग से आईपी और पोर्ट पास करना होगा, और कास्टिंग portकरना होगा int()। में Proxy()वर्ग तुम सिर्फ स्ट्रिंग Containig पारित "आईपी: पोर्ट", और निश्चित रूप से यह आप के लिए काम करते के बाकी है।
m3nda

7

Sock5 प्रॉक्सी भी सेट करने का प्रयास करें। मैं एक ही समस्या का सामना कर रहा था और यह मोजे प्रॉक्सी का उपयोग करके हल किया गया है

def install_proxy(PROXY_HOST,PROXY_PORT):
        fp = webdriver.FirefoxProfile()
        print PROXY_PORT
        print PROXY_HOST
        fp.set_preference("network.proxy.type", 1)
        fp.set_preference("network.proxy.http",PROXY_HOST)
        fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
        fp.set_preference("network.proxy.https",PROXY_HOST)
        fp.set_preference("network.proxy.https_port",int(PROXY_PORT))
        fp.set_preference("network.proxy.ssl",PROXY_HOST)
        fp.set_preference("network.proxy.ssl_port",int(PROXY_PORT))  
        fp.set_preference("network.proxy.ftp",PROXY_HOST)
        fp.set_preference("network.proxy.ftp_port",int(PROXY_PORT))   
        fp.set_preference("network.proxy.socks",PROXY_HOST)
        fp.set_preference("network.proxy.socks_port",int(PROXY_PORT))   
        fp.set_preference("general.useragent.override","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A")
        fp.update_preferences()
        return webdriver.Firefox(firefox_profile=fp)

फिर install_proxy ( ip , port ) अपने प्रोग्राम से कॉल करें ।


प्रॉक्सी क्रेडेंशियल स्वीकार करने के लिए आप इसे कैसे संशोधित करेंगे?
nomaam

7

सत्यापन के साथ प्रॉक्सी। यह एक Mykhail Martsyniuk नमूना स्क्रिप्ट के संदर्भ में एक पूरी नई अजगर स्क्रिप्ट है।

# Load webdriver
from selenium import webdriver

# Load proxy option
from selenium.webdriver.common.proxy import Proxy, ProxyType

# Configure Proxy Option
prox = Proxy()
prox.proxy_type = ProxyType.MANUAL

# Proxy IP & Port
prox.http_proxy = “0.0.0.0:00000”
prox.socks_proxy = “0.0.0.0:00000”
prox.ssl_proxy = “0.0.0.0:00000# Configure capabilities 
capabilities = webdriver.DesiredCapabilities.CHROME
prox.add_to_capabilities(capabilities)

# Configure ChromeOptions
driver = webdriver.Chrome(executable_path='/usr/local/share chromedriver',desired_capabilities=capabilities)

# Verify proxy ip
driver.get("http://www.whatsmyip.org/")

6

अगर किसी को यहाँ समाधान के लिए देख रहा है कैसे:

from selenium import webdriver
PROXY = "YOUR_PROXY_ADDRESS_HERE"
webdriver.DesiredCapabilities.FIREFOX['proxy']={
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":None,
    "proxyType":"MANUAL",
    "autodetect":False
}
driver = webdriver.Firefox()
driver.get('http://www.whatsmyip.org/')

4

FirefoxProfile सेट करके प्रयास करें

from selenium import webdriver
import time


"Define Both ProxyHost and ProxyPort as String"
ProxyHost = "54.84.95.51" 
ProxyPort = "8083"



def ChangeProxy(ProxyHost ,ProxyPort):
    "Define Firefox Profile with you ProxyHost and ProxyPort"
    profile = webdriver.FirefoxProfile()
    profile.set_preference("network.proxy.type", 1)
    profile.set_preference("network.proxy.http", ProxyHost )
    profile.set_preference("network.proxy.http_port", int(ProxyPort))
    profile.update_preferences()
    return webdriver.Firefox(firefox_profile=profile)


def FixProxy():
    ""Reset Firefox Profile""
    profile = webdriver.FirefoxProfile()
    profile.set_preference("network.proxy.type", 0)
    return webdriver.Firefox(firefox_profile=profile)


driver = ChangeProxy(ProxyHost ,ProxyPort)
driver.get("http://whatismyipaddress.com")

time.sleep(5)

driver = FixProxy()
driver.get("http://whatismyipaddress.com")

यह कार्यक्रम विंडोज 8 और मैक ओएसएक्स दोनों पर परीक्षण किया गया। यदि आप Mac OSX का उपयोग कर रहे हैं और यदि आपके पास सेलेनियम अपडेट नहीं है तो आप सामना कर सकते हैं selenium.common.exceptions.WebDriverException। यदि ऐसा है, तो अपने सेलेनियम को अपग्रेड करने के बाद फिर से प्रयास करें

pip install -U selenium

4

ऊपर वर्णित परिणाम सही हो सकता है, लेकिन नवीनतम वेबड्राइवर के साथ काम नहीं कर रहा है। उपरोक्त प्रश्न के लिए यहां मेरा समाधान है। सरल और मीठा


        http_proxy  = "ip_addr:port"
        https_proxy = "ip_addr:port"

        webdriver.DesiredCapabilities.FIREFOX['proxy']={
            "httpProxy":http_proxy,
            "sslProxy":https_proxy,
            "proxyType":"MANUAL"
        }

        driver = webdriver.Firefox()

या

    http_proxy  = "http://ip:port"
    https_proxy = "https://ip:port"

    proxyDict = {
                    "http"  : http_proxy,
                    "https" : https_proxy,
                }

    driver = webdriver.Firefox(proxy=proxyDict)

2

इस सवाल पर ऊपर दिए गए और या तो मेरे लिए सेलेनियम 3.14 और लिनक्स पर फ़ायरफ़ॉक्स 68.9 के साथ काम नहीं किया, या अनावश्यक रूप से जटिल हैं। मुझे एक WPAD कॉन्फ़िगरेशन का उपयोग करने की आवश्यकता थी, कभी-कभी एक प्रॉक्सी के पीछे (एक वीपीएन पर), और कभी-कभी नहीं। कोड का थोड़ा अध्ययन करने के बाद, मैं आया:

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

proxy = Proxy({'proxyAutoconfigUrl': 'http://wpad/wpad.dat'})
profile = FirefoxProfile()
profile.set_proxy(proxy)
driver = webdriver.Firefox(firefox_profile=profile)

प्रॉक्सी इनिशियलाइज़ेशन प्रॉक्सी-प्रॉक्सी को ProxyType.PAC (URL से ऑटोकॉनफिगरेशन) साइड-इफ़ेक्ट के रूप में सेट करता है।

इसने फ़ायरफ़ॉक्स के ऑटोडेट के साथ भी काम किया,

from selenium.webdriver.common.proxy import ProxyType

proxy = Proxy({'proxyType': ProxyType.AUTODETECT})

लेकिन मुझे नहीं लगता कि यह दोनों आंतरिक यूआरएल (अनुमानित नहीं) और बाहरी (अनुमानित) के साथ काम करेगा जिस तरह से WPAD करता है। इसी तरह की प्रॉक्सी सेटिंग्स को मैनुअल कॉन्फ़िगरेशन के लिए भी काम करना चाहिए। यहां कोड में संभावित प्रॉक्सी सेटिंग्स देखी जा सकती हैं

ध्यान दें कि proxy=proxyड्राइवर के रूप में सीधे प्रॉक्सी ऑब्जेक्ट को पास करने से काम नहीं होता है - यह स्वीकार किया जाता है लेकिन इसे अनदेखा किया जाता है (एक डिप्रेसेशन चेतावनी होनी चाहिए, लेकिन मेरे मामले में मुझे लगता है कि व्यवहार इसे निगल रहा है)।



0

यह मेरे लिए काम करता है और एक सिर रहित ब्राउज़र का उपयोग करने की अनुमति देता है, आपको बस अपने प्रॉक्सी को पारित करने की विधि को कॉल करने की आवश्यकता है।

def setProxy(proxy):
        options = Options()
        options.headless = True
        #options.add_argument("--window-size=1920,1200")
        options.add_argument("--disable-dev-shm-usage")
        options.add_argument("--no-sandbox")
        prox = Proxy()
        prox.proxy_type = ProxyType.MANUAL
        prox.http_proxy = proxy
        prox.ssl_proxy = proxy
        capabilities = webdriver.DesiredCapabilities.CHROME
        prox.add_to_capabilities(capabilities)
        return webdriver.Chrome(desired_capabilities=capabilities, options=options, executable_path=DRIVER_PATH)

-1

टॉर सर्विस चलाने का प्रयास करें, निम्न फ़ंक्शन को अपने कोड में जोड़ें।

def connect_tor(port):

socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', port, True)
socket.socket = socks.socksocket

def main():

connect_tor()
driver = webdriver.Firefox()

इस पोस्ट में जानकारी का अभाव है, connect_tor () और main () फ़ंक्शंस में कोई सही इंडेंटेशन नहीं है, और connect_tor () कॉल मिस पर अनिवार्य तर्क "पोर्ट" को याद कर रहा है। मुझे कौन से टोर पोर्ट का उपयोग करना चाहिए? मुझे टो की पोर्ट जानकारी कहां मिल सकती है?
कार्ल

टो नेटवर्क (भले ही गुमनामी की एक अतिरिक्त परत जोड़ता है) बहुत धीमा है।
संदेहपूर्ण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.