Chạy Selenium Webdriver với proxy bằng Python


84

Tôi đang cố gắng chạy tập lệnh Selenium Webdriver bằng Python để thực hiện một số tác vụ cơ bản. Tôi có thể làm cho robot hoạt động hoàn hảo khi chạy nó qua giao diện Selenium IDE (tức là: khi chỉ cần nhận GUI để lặp lại hành động của tôi). Tuy nhiên, khi tôi xuất mã dưới dạng tập lệnh Python và cố gắng thực thi nó từ dòng lệnh, trình duyệt Firefox sẽ mở nhưng không thể truy cập URL bắt đầu (lỗi được trả về dòng lệnh và chương trình dừng lại). Điều này đang xảy ra với tôi bất kể trang web nào, v.v. Tôi đang cố gắng truy cập.

Tôi đã bao gồm một mã rất cơ bản ở đây cho mục đích trình diễn. Tôi không nghĩ rằng tôi đã bao gồm phần proxy của mã một cách chính xác vì lỗi được trả về dường như do proxy tạo ra.

Bất cứ sự giúp đỡ nào cũng được đánh giá cao.

Đoạn mã dưới đây chỉ đơn giản là để mở www.google.ie và tìm kiếm từ "selen". Đối với tôi, nó mở một trình duyệt firefox trống và dừng lại.

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

Câu trả lời:


41

Hoạt động với tôi theo cách này (tương tự như mã @Amey và @ user4642224, nhưng ngắn hơn một chút):

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
điều này làm việc, cảm ơn bạn. kỳ lạ là các tài liệu nói rằng bạn cần sử dụng trình điều khiển từ xa.
Mans

driver = webdriver.Firefox (mong muốn_có khả năng = khả năng) LoạiError: __init __ () có một đối số từ khóa không mong muốn 'wish_capabilities' tại sao?
Rimo

33

Còn những thứ như thế này thì sao

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)

Bạn có thể đọc thêm về nó ở đây .


Câu trả lời này làm việc tốt cho tôi. Trong trường hợp bất kỳ ai khác đang cố gắng thực hiện việc này với Edge, webdriver.DesiredCapabilities.EDGE['proxy']sẽ không có tác dụng vì Microsoft Edge hiện không có cài đặt để định cấu hình máy chủ proxy (để sử dụng Edge với proxy, bạn phải định cấu hình proxy trong cài đặt kết nối mạng Windows) .
Steve HHH

1
Để có tài liệu chi tiết đầy đủ, hãy xem: github.com/SeleniumHQ/selenium/wiki/…
LeckieNi

14

Giải pháp của tôi:

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)

Sau đó, gọi trong mã của bạn:

my_proxy(PROXY_HOST,PROXY_PORT)

Tôi gặp sự cố với mã này vì tôi đang chuyển một chuỗi dưới dạng cổng #:

 PROXY_PORT="31280"

Cái này quan trọng:

int("31280")

Bạn phải chuyển một số nguyên thay vì một chuỗi, nếu không hồ sơ firefox của bạn sẽ không được đặt thành một cổng thích hợp và kết nối thông qua proxy sẽ không hoạt động.


1
Cổng cần được chuyển đổi thành int? Điều đó sẽ làm cho ví dụ proxy của Firefox trên trang chính thức bị sai: seleniumhq.org/docs/04_webdriver_advanced.jsp Trong ví dụ của họ, PROXYHOST: PROXYPORT được truyền dưới dạng một chuỗi.
Pyderman

@Pyderman, bạn đang nhầm lẫn giữa Proxy()lớp với FirefoxProfile()lớp. Sử dụng tùy chọn hồ sơ, bạn phải chuyển ip và cổng riêng biệt và truyền porttới int(). Trong Proxy()lớp, bạn chỉ cần chuyển chuỗi containernig "IP: PORT", và chắc chắn nó sẽ thực hiện phần còn lại của bạn.
m3nda

7

Thử thiết lập proxy sock5 nữa. Tôi đã gặp phải vấn đề tương tự và nó được giải quyết bằng cách sử dụng proxy vớ

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)

Sau đó gọi install_proxy ( ip , port ) từ chương trình của bạn.


bạn sẽ sửa đổi điều này như thế nào để chấp nhận thông tin đăng nhập proxy?
nomaam

6

Nếu ai đó đang tìm kiếm một giải pháp, đây là cách:

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

6

Proxy với xác minh. Đây là một tập lệnh python hoàn toàn mới trong tham chiếu từ tập lệnh mẫu 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/")

4

Thử bằng cách thiết lập 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")

Chương trình này đã thử nghiệm trên cả Windows 8 và Mac OSX. Nếu bạn đang sử dụng Mac OSX và nếu bạn không cập nhật selen thì bạn có thể phải đối mặt selenium.common.exceptions.WebDriverException. Nếu vậy, hãy thử lại sau khi nâng cấp selen của bạn

pip install -U selenium

4

Kết quả nêu trên có thể đúng, nhưng không hoạt động với trình duyệt web mới nhất. Đây là giải pháp của tôi cho câu hỏi trên. Đơn giản và ngọt ngào


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

HOẶC LÀ

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

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

    driver = webdriver.Firefox(proxy=proxyDict)

2

Các câu trả lời ở trên và cho câu hỏi này không phù hợp với tôi với Selenium 3.14 và Firefox 68.9 trên Linux, hoặc phức tạp một cách không cần thiết. Tôi cần sử dụng cấu hình WPAD, đôi khi đằng sau proxy (trên VPN) và đôi khi không. Sau khi nghiên cứu mã một chút, tôi đã nghĩ ra:

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)

Khởi tạo Proxy đặt proxyType thành ProxyType.PAC (tự động cấu hình từ một URL) như một tác dụng phụ.

Nó cũng hoạt động với tính năng tự động phát hiện của Firefox, sử dụng:

from selenium.webdriver.common.proxy import ProxyType

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

Nhưng tôi không nghĩ rằng điều này sẽ hoạt động với cả URL nội bộ (không được ủy quyền) và bên ngoài (được ủy quyền) như cách WPAD làm. Cài đặt proxy tương tự cũng sẽ hoạt động cho cấu hình thủ công. Các cài đặt proxy có thể có trong mã ở đây .

Lưu ý rằng việc truyền trực tiếp đối tượng Proxy proxy=proxytới trình điều khiển KHÔNG hoạt động - nó được chấp nhận nhưng bị bỏ qua (nên có cảnh báo không dùng nữa, nhưng trong trường hợp của tôi, tôi nghĩ Behave đang nuốt nó).


0

Như đã nêu bởi @Dugini, một số mục cấu hình đã bị xóa. Tối đa:

webdriver.DesiredCapabilities.FIREFOX['proxy'] = {
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":[],
    "proxyType":"MANUAL"
 }

0

Điều này phù hợp với tôi và cho phép sử dụng trình duyệt không có đầu, bạn chỉ cần gọi phương thức truyền proxy của mình.

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

thử chạy dịch vụ tor, thêm chức năng sau vào mã của bạn.

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

Bài đăng này thiếu thông tin, các hàm connect_tor () và main () không có thụt lề chính xác và lệnh gọi connect_tor () thiếu đối số bắt buộc "cổng" trên ví dụ. Tôi nên sử dụng cổng tor nào? Tôi có thể lấy thông tin cổng của Tor ở đâu?
Karl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.