selenium多线程简单应用
前言
关哥博客新增了浏览量,个位数的浏览量怎么配得上关哥身份,给Metal-Cell刷点浏览量。
初始代码
发现只要刷新就会计入访问量,所以只需调用selenium
刷新网页的功能就行
from selenium import webdriver
import threading
#浏览器请求头
headers = {
"Cookie" : "XXXXXX",
"user-agent": "xxxxx"
}
# 浏览器相关设置
chrome_path = r'path\to\chromedriver.exe'
chrome_options = webdriver.ChromeOptions()
#忽略ssl验证
chrome_options.add_argument('--ignore-certificate-errors')
# 无窗口运行
# chrome_options.add_argument("--headless")
driver = webdriver.Chrome(executable_path=chrome_path, options=chrome_options)
# 博客链接
url = "xxxxxx"
driver.get(url)
#刷新网页
driver.refresh()
设置代理
# 创建 webdriver 并设置代理IP
proxy = '127.0.0.1:10808'
chrome_options.add_argument('--proxy-server=http://' + proxy)
driver = webdriver.Chrome(executable_path=chrome_path, options=chrome_options)
加入多线程
import threading
def start_brower():
headers = {
"Cookie" : "xxx",
"user-agent" : "xxx"
}
chrome_path = r'path\to\chromedriver.exe'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--ignore-certificate-errors')
driver = webdriver.Chrome(executable_path=chrome_path, options=chrome_options)
return driver
def brower_thread(driver: webdriver.Chrome, idx: int:):
url_list = ['https://www.baidu.com','https://music.163.com/', 'https://y.qq.com/']
try:
#lock.acquire()
#driver.execute_script(f"window.open('{url_list[idx]}')") # 打开浏览器标签页
driver.get(url_list[idx])
return True
except Exception:
return False
#finally:
# lock.release()
def main():
# 多线程与多浏览器
#driver = start_browser()
for idx in range(5):
driver = start_browser()
threading.Thread(target=browser_thread, args=(driver, idx)).start()
# 等待所有线程执行完毕
for thread in threading.enumerate():
if thread is not threading.current_thread():
thread.join()
-
如果是 多线程 和 多浏览器 ,则不需要线程锁,每一个线程都有一个webdriver
-
如果是 多线程 和 多标签页 ,共用一个浏览器,会出现资源争夺的情况,需要在线程的首位加上
lock.acquire()
和lock.release()
,确保线程安全
线程池
from concurrent.futures import ThreadPoolExecutor, as_completed
max_workers=MAX_WORKERS = 5
def main():
#创建线程池
executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)
ths = list()
driver = start_browser()
for idx in range(5):
# driver = start_browser()
#启动
th = executor.submit(browser_thread, driver, idx=idx)
ths.append(th)
# 获取线程执行结果
for future in as_completed(ths):
print(future.result())
区别
- 创建和维护线程的方式:
- 多线程:在需要并发执行任务时,直接创建并启动多个线程。你手动管理线程的创建、启动、终止和资源释放。
- 线程池:创建一个线程池,它会在程序启动时预先创建一组线程,并在需要时重用这些线程。线程池负责管理线程的生命周期,包括创建、启动、终止和回收。
- 资源管理:
- 多线程:需要手动管理线程的数量和资源,可能会导致系统资源的浪费或线程过多的问题。
- 线程池:通过线程池管理,可以更有效地控制线程的数量,避免资源过度占用。
- 任务调度:
- 多线程:需要手动分配任务给不同的线程,可能需要考虑同步和互斥机制来避免竞争条件。
- 线程池:线程池会自动分配任务给可用线程,并处理任务队列,简化了任务调度的工作。
- 性能和效率:
- 多线程:如果线程的创建和销毁频繁,可能会导致性能开销增加。
- 线程池:通过线程的重用,可以减少线程的创建和销毁开销,提高性能和效率。
更新:
在4.10.0的selenium
中,设置浏览器需要这样写:
删除了exectable_path
改用service
传参
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service(executable_path='./chromedriver.exe')
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)
# ...
driver.quit()
参考:设置ip池
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 桥边红药的博客!
评论