【问题标题】:how to use chrome webdriver headless with .pac file proxy in python?如何在python中使用带有.pac文件代理的chrome webdriver headless?
【发布时间】:2019-11-19 05:49:15
【问题描述】:

情况如下: 我有一个 .pac 网址作为代理。在 Ubuntu 中,代理可以用作网络代理,设置为自动模式并在配置 URL 中填写 .pac url。 当我使用 python 从 Google Image 抓取时,对 google 的请求将不起作用。所以我使用 selenium 的 chrome webdriver 来模拟用户的鼠标和键盘操作及其工作。 然后我添加了'--headless'参数来增加并发量,我得到了一个TimeoutException。

然后我下载.pac文件并尝试使用“options.add_argument('--proxy-pac-url=xxx.pac')”来解决这个问题,但是代理仍然不起作用。

我得到了一个解决方案,它使用名为“SwitchyOmega”的 chrome 扩展来使用 .pac 文件代理。 当我从 github 下载最新版本并使用“options.add_extension('xxx/SwitchyOmega_Chromium.crx')”加载扩展时,我得到:“来自未知错误:CRX 验证失败:3”

最后,我在 chrome 中配置 SwitchyOmega 并使用开发者工具将本地扩展文件打包为 .crx 并且扩展在 webdriver 中正确加载。但我发现扩展名未配置。

那么我该如何解决这个代理问题,谢谢!

这是我的代码:

class GoogleCrawler:

def __init__(self):
    driver_executable = self.get_driver_executable()
    options = webdriver.ChromeOptions()
    options.add_argument('blink-settings=imagesEnabled=false')
    # options.add_argument('--headless')
    # options.add_argument('--proxy-pac-url=./xxx.pac')
    # options.add_extension('./SwitchyOmega_Chromium.crx')
    self.browser = webdriver.Chrome(driver_executable,
                                    chrome_options=options)
    self.driver_version_check()

def get_google_image_urls(self, keyword):
    self.browser.get(f'https://www.google.com/search?q={keyword}&tbm=isch')
    time.sleep(2)

    img_urls = []
    first_thumbnail_image_xpath = '//div[@data-ri="0"]'
    image_xpath = '//div[@class="irc_c i8187 immersive-container"]//img[@class="irc_mi"]'
    body_element = self.browser.find_element_by_tag_name('body')

    wait = WebDriverWait(self.browser, 15)
    first_thumbnail_image = wait.until(
        element_to_be_clickable((By.XPATH, first_thumbnail_image_xpath)))
    first_thumbnail_image.click()

    scroll_flag = 0
    last_scroll_distance = 0
    while scroll_flag <= 50:
        image_elements = self.browser.find_elements(By.XPATH, image_xpath)
        img_urls.extend([
            image_element.get_attribute('src')
            for image_element in image_elements
        ])

        body_element.send_keys(Keys.RIGHT)

        scroll_distance = self.browser.execute_script(
            'return window.pageYOffset;')
        if scroll_distance == last_scroll_distance:
            scroll_flag += 1
        else:
            last_scroll_distance = scroll_distance
            scroll_flag = 0

    self.browser.close()
    img_urls = set(img_urls)
    print(
        f'[INFO]Scraping Image urls DONE: Keyword: {keyword}, Total: {len(img_urls)}'
    )
    return keyword, img_urls

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    由于无头 Chrome doesn't support PAC files,并且由于它不支持 Chrome 扩展,我认为这不是让您使用 PAC 文件的方法。

    您能否运行自己的代理,在该代理中使用逻辑,并将其传递给--proxy-server Chrome 标志。

    【讨论】:

    • 是的,知道了原因。所以我转向 Firefox 并且 PAC 文件有效
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2018-04-14
    • 2017-11-24
    • 2015-10-10
    • 2019-05-08
    • 2021-08-27
    • 2021-01-28
    • 2012-07-12
    相关资源
    最近更新 更多