Selenium + Chrome 使用用户名密码认证的代理IP封装

十点数据 1年前 ⋅ 984 阅读

主要参考githubCreateProxyExtensionHelper 项目。

具体操作及代码如下:

1:处理代理IP的核心类《ExtensionHelper》

from selenium import webdriver  
from PIL import Image
import os
import re
import time
import shutil
import zipfile

class ExtensionHelper(object):
    '''Selenium + Chrome 使用用户名密码认证的代理封装'''

    CHROME_PROXY_HELPER_DIR = 'c:/Chrome-proxy-helper'  # Chrome代理模板插件目录
    CUSTOM_CHROME_PROXY_EXTENSIONS_DIR = 'c:/chrome-proxy-extensions'  # 存储自定义Chrome代理扩展文件的目录

    @classmethod
    def create_extension(cls, proxy):
        '''
        创建插件
        :param proxy: username:password@ip:port
        :return:
        '''
        m = re.compile('([^:]+):([^\@]+)\@([\d\.]+):(\d+)').search(proxy)  # 匹配代理格式是否正确
        if m:
            # 提取代理的各项参数
            username = m.groups()[0]
            password = m.groups()[1]
            ip = m.groups()[2]
            port = m.groups()[3]
            # 创建一个定制Chrome代理扩展(zip文件)
            if os.path.exists(cls.CUSTOM_CHROME_PROXY_EXTENSIONS_DIR):
                shutil.rmtree(cls.CUSTOM_CHROME_PROXY_EXTENSIONS_DIR)
            os.mkdir(cls.CUSTOM_CHROME_PROXY_EXTENSIONS_DIR)
            extension_file_path = os.path.join(cls.CUSTOM_CHROME_PROXY_EXTENSIONS_DIR,
                                               '{}.zip'.format(proxy.replace(':', '_')))
            if not os.path.exists(extension_file_path):
                # 扩展文件不存在,创建
                zf = zipfile.ZipFile(extension_file_path, mode='w')
                zf.write(os.path.join(cls.CHROME_PROXY_HELPER_DIR, 'manifest.json'), 'manifest.json')
                # 替换模板中的代理参数
                background_content = open(os.path.join(cls.CHROME_PROXY_HELPER_DIR, 'background.js')).read()
                background_content = background_content.replace('%proxy_host', ip)
                background_content = background_content.replace('%proxy_port', port)
                background_content = background_content.replace('%username', username)
                background_content = background_content.replace('%password', password)
                zf.writestr('background.js', background_content)
                zf.close()
            return extension_file_path
        else:
            raise Exception('代理格式错误: username:password@ip:port')

2:调用方式;

# 自定义修改
user_pass =  '代理IP用户名:代理IP密码'
host, port = "代理IP","代理ip端口"
proxy = '{0}@{1}:{2}'.format(user_pass, host, port)  # 格式:username:password@ip:port
options = webdriver.ChromeOptions()
options.add_extension(ExtensionHelper.create_extension(proxy))  # 需要验证(调用封装方法、添加插件)
# options.add_argument("--proxy-server=http://{}:{}".format(host, port))    # 不需验证
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://weixin.sogou.com/weixin?type=1&s_from=input&query=%E6%95%B0%E6%8D%AE&ie=utf8&_sug_=n&_sug_type_=')
time.sleep(10)
driver.quit()

以上方式亲测有效,目前已使用到搜狗微信公众号的采集中。

全部评论: 0

    我有话说: