前言:
曾找过各种方式去加速selenium,然而效果都不尽人意,最后自己花了一些时间做了一个高效selenium模块,加上高效代理,一天请求百万次可能有些吃力(cpu、网速等各方面),但是几十万的请求次数在线上测试环境没什么问题。
设计逻辑:
使用Selenium(模拟浏览器)加上代理,一次启动可同时打开10个(可调整)页面发起请求,并使用字典绑定每个url对应的页面权柄。在等待一定加载时间后(如20秒,可调整),开始从第一个页面开始,利用Selenium显示等待WebDriverWait(在一定时间内如果检测不到指定内容则报错)进行特定标签的检测(如商品名title标签),检测到则调用成功函数,失败则等待极短时间后再次检测,再次失败则调用失败 函数。 防止selenium卡在加载界面,加入selenium的最长加载时间,并且加入不同机制提升效率,如第一个页面最长等待时间为20秒,当遇到失败界面时调整为2秒,再次遇到失败界面调整为1秒,递减直至0.5秒。
截图:
代码部分(简单的可跑的demo):
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
from loguru import logger
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from multiprocessing import Process, Pool
import os
import time
import random, traceback
def get_proxy():
return "1.1.1.1"
class Selenium_Obj(object):
def __init__(self, headless=True, proxy=True):
self.proxy = proxy
self.chrome_options = ChromeOptions()
# 不加载图片 不加载JS
No_Image_loading = {'profile.default_content_setting_values': {'images': 2, 'javascript': 2}}