-
紫鸟超级浏览器-SeleniumAPI通信
超级浏览器Webdriver自动化开发
一、概述
通过Webdriver实现对超级浏览器内的店铺进行,自动化控制以及数据抓取,主要流程分为以下两个部分
(一)与超级浏览器主进程通信。
这个部分是通过Socket实现与超级浏览器主进实现通讯的,主要工作是获取店铺列表以及准备店铺环境,一个店铺相当于一个独立浏览器。
import json
import subprocess
from socket import *
from selenium import webdriver
from db.db_redis import DBRedis
from common.utility import Utility
from common.mapping import Mapping
from common.global_logger import logger
from selenium.webdriver import ActionChains
from selenium.common.exceptions import NoSuchElementException
class SuperBrowser(object):
# 基础配置
utils = Utility()
config = utils.confg
# 初始化Redis服务
obj_redis = DBRedis()
# 获取业务类型
business_type = config.get('business_type')
logger.info("business_type: %s" % business_type)
# 指定使用英语
__LANGUAGE = config.get('language')
# ----------------------------------------->> Socket通信地址端口
host = config.get('socket_host')
port = int(config.get('socket_port'))
logger.info('socket > host: %s, port: %s' % (host, port))
# ----------------------------------------->> 请求紫鸟超级浏览器API方法
__GET_BROWSER_LIST = "getBrowserList" # 获取店铺列表
__START_BROWSER = "startBrowser" # 启动店铺(主程序)
__STOP_BROWSER = "stopBrowser" # 关闭店铺窗口
__GET_BROWSER_ENV_INFO = "getBrowserEnvInfo" # 启动店铺(webdriver)
__HEARTBEAT = "heartbeat" # 非必要接口,只是用于保活Socket连接
__EXIT = "exit" # 正常退出超级浏览器主进程,会自动关闭已启动店铺并保持店铺cookie等信息。
def __init__(self):
logger.info("初始化Socket连接...")
logger.info("启动紫鸟浏览器......")
self.buf_size = int(self.config.get('socket_buf_size'))
self.IS_HEADLESS = self.config.get('browser_is_headless') # 浏览器是否启用无头模式 false 否、true 是
# 获取紫鸟·超级浏览器安装路径
path_super_browser = self.config.get('path_super_browser')
cmd = "{} --run_type=web_driver --socket_port={}".format(path_super_browser, self.port)
subprocess.Popen(cmd)
try:
# ------------------------------创建套接字通道
self.address = (self.host, self.port)
self.tcpCliSock = socket(AF_INET, SOCK_STREAM) # 创建套接字
self.tcpCliSock.connect(self.address) # 主动初始化TCP服务器连接
except ConnectionRefusedError as e:
logger.error(e)
subprocess.Popen('taskkill /f /im superbrowser.exe')
except Exception as e:
logger.error(e)
def browser_api(self, action, args=None):
"""
紫鸟·超级浏览器API
:param action: 方法
:param args: 可选参数
:return:
"""
REQUEST_ID = "0123456789" # 全局唯一标识
user_info = json.dumps({ # 用户信息
"company": self.config.get('browser_company_name'),
"username": self.config.get('browser_username'),
"password": self.config.get('browser_password')
})
# 默认为获取店铺列表
common = {"userInfo": user_info, "action": self.__GET_BROWSER_LIST, "requestId": REQUEST_ID}
if action == self.__START_BROWSER or action == self.__GET_BROWSER_ENV_INFO or action == self.__STOP_BROWSER:
common['browserOauth'] = args['browserOauth']
common['isHeadless'] = args['isHeadless']
common['action'] = action
return common
def socket_communication(self, params):
"""
Socket通信
:param params: 参数对象
:return:
"""
try:
args = (str(params) + '\r\n').encode('utf-8')
# 将 string 中的数据发送到连接的套接字
self.tcpCliSock.send(args)
# 接收的最大数据量
res = self.tcpCliSock.recv(self.buf_size)
return json.loads(res)
except ConnectionResetError as e:
logger.warning("ConnectionResetError: %s" % e)
logger.info("socket 连接已关闭")
except Exception as e:
logger.error("socket_communication error: %s" % e)
pass
# 举个栗子
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数