Selenium控制已打开的chrome、IE浏览器

0 为什么要接管打开的浏览器

1、重复重新登录,过程麻烦

2、拖慢爬虫的运行速度

3、容易让网站检测到账号异常

如何解决重复登录的问题

1、使用登录过的cookie,下次运行时设置保存

2、接管打开的浏览器,也是我们接下来重点讲的

1 控制已打开的chrome浏览器

1.1 接管的原理

Chrome浏览器是支持远程调试模式的。这个模式打开的情况下,Puppeteer或者Selenium可以通过websocket连上去,进而控制它。

下面氛围启动浏览器和启动爬虫接管两部分

1.2 启动浏览器

启动Chrome的远程调试端口

第一步:你需要找到Chrome的安装位置,在Chrome的地址栏输入chrome://version就能找到Chrome的安装路径,如下图所示:

Selenium控制已打开的chrome、IE浏览器_第1张图片

 找到路径后,先创建一个空白的文件夹,后面需要存放打开远程浏览器的内容。

 第二步:执行命令启动支持远程调试功能的Chrome【启动后不要关闭!】

以windows系统为例:键盘同时按下:windows旗帜键+R,调出运行,然后输入:cmd,回车调出命令提示框,然后之下面命令。

Selenium控制已打开的chrome、IE浏览器_第2张图片 

windows系统命令:

文件路径/chrome.exe --remote-debugging-port=9222 --user-data-dir="某个空白文件夹地址"

参数说明:

--remote-debugging-port:可以指定任意可使用的端口

--user-data-dir:指定创建新的chrome配置目录,作用是防止污染默认配置 

注意:如果路径中含有空格,在下面命令使用的时候会有问题,因为命令是不能有空格

【解决方法:】在文件中直接打开该路径,然后在路径输入栏里面输入:cmd,然后回车,就能调出该目录下的命令提示框。同时命令也被简化成:chrome.exe --remote-debugging-port=9222 --user-data-dir="某个空白文件夹地址"

mac系统命令:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"  --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')

注意:由于地址中有空格,所以要把可执行文件的路径用引号抱起来。 

Selenium控制已打开的chrome、IE浏览器_第3张图片

第三步:手动新开一个浏览器,并访问下面地址

http://127.0.0.1:9222/json/version

访问地址后,我们可以看到一段json信息,记住最下方的webSocketDebuggerUrl,这个就是我们后面需要远程访问的链接。

Selenium控制已打开的chrome、IE浏览器_第4张图片

ws://127.0.0.1:9222/devtools/browser/d1f5ebaf-ae68-4057-91db-cd8e2df81f68(以实际为准)。

1.3 爬虫接管

通过上面的步骤,我们成功启动Chrome并开放9222端口,下面我们通过代码来实现控制刚才已打开的chrome浏览器访问我们的目标网址。

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = Chrome(
    service=Service(r'D:\software\PyCharmLib\chromedriver.exe'),
    options=chrome_options)
# 注意:把chromedriver文件放到了当前文件夹里面,可以这样调用
# driver = Chrome('./chromedriver.exe', options=chrome_options)

driver.get('https://blog.csdn.net/HRG520JN/article/details/125936986')
http_str = input('输入任意地址,无则回车')
if http_str:
    http_str = http_str
else:
    http_str = 'https://blog.csdn.net/HRG520JN/article/details/125781184'
driver.get(http_str)

http_str2 = input('输入任意内容地址,无则回车查看selenium全面讲解文章')
if http_str2:
    http_str2 = http_str2
else:
    http_str2 = 'https://blog.csdn.net/HRG520JN/article/details/125781184'
driver.get(http_str2)

为了证明确实有效控制,我在上面代码加入了本人的博客文章地址,如果有内容输入则访问,无则访问selenium文章讲解。

2 控制已打开的IE浏览器

因为很多政务系统都是需要ie或者edge浏览器操作,前期需要人工手动打开各种安全控制软件,如果通过自动化主动打开浏览器是无法打开那些系统的,所以前期就需要先人工操作再由selenium接管IE浏览器来实现。

2.1 创建session

通过第一次打开ie浏览器,然后将其session_id和地址保存在本地session.ini文件中。

CreateSession.py

import sys
import configparser
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

sys.path.append("..")
# 这里是自己下载的ie驱动
iedriver = Service('D:\software\PyCharmLib\IEDriverServer.exe')
driver = webdriver.Ie(service=iedriver)
url = driver.command_executor._url
session_id=driver.session_id
print(driver.session_id)
print(driver.command_executor._url)

config = configparser.ConfigParser()
config.add_section("IE")
config.set("IE", "url", url)
config.set("IE", "session_id", session_id)

with open("session.ini", "w+") as f:
	config.write(f)
f.close()

运行后,会在同目录下生成一个session.ini文件,里面内容如下:

Selenium控制已打开的chrome、IE浏览器_第5张图片 

2.2 重写remote

ReuseIe.py,这里不用运行,将由下面接管的时候引用处理

from selenium.webdriver import Remote

class ReuseIe(Remote):
    def __init__(self, command_executor, session_id):
        self.r_session_id = session_id
        Remote.__init__(self, command_executor=command_executor, desired_capabilities={})

    def start_session(self, desired_capabilities, browser_profile=None):
        capabilities = {'desiredCapabilities': {}, 'requiredCapabilities': {}}
        for k, v in desired_capabilities.items():
            if k not in ('desiredCapabilities', 'requiredCapabilities'):
                capabilities['desiredCapabilities'][k] = v
            else:
                capabilities[k].update(v)
        if browser_profile:
            capabilities['desiredCapabilities']['firefox_profile'] = browser_profile.encoded

        self.session_id = self.r_session_id
        # self.capabilities = options.Options().to_capabilities()
        self.w3c = False

2.3 接管打开的IE浏览器

useie.py

import sys
import configparser
from ReuseIe import *

sys.path.append("..")
config = configparser.ConfigParser()
config.read("session.ini", encoding="utf-8")
url = config.get("IE", "url")
session_id = config.get("IE", "session_id")
print(session_id)
print(url)

driver = ReuseIe(url, session_id)
driver.get("https://www.csdn.net")

运行useie.py后我们会发现,没有新增ie浏览器,使用的就是刚才我们打开的浏览器,在实际应用中,根据业务再自行封装起来使用,思路是提供一个运行文件让操作员点击,先启动ie浏览器,然后再启动咱们的核心程序就可以了。

Selenium控制已打开的chrome、IE浏览器_第6张图片

3 写在最后

如果对selenium chrome、ie浏览器驱动不懂的,可以看下这篇文章的第2点 安装浏览器驱动 或者学习下有关于selenium基础

学习过程中有什么问题,欢迎下方评论交流。

你可能感兴趣的:(python爬虫宝典,chrome,selenium,测试工具,爬虫)