只更新一次 webdriver 并将其用于各种功能和循环

Only update webdriver for one time and use it for various functions and loops

我有一个简单的网络爬虫,我会循环使用它从 YouTube 视频中抓取信息,如下所示

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

def Scrap(url):
    options = webdriver.ChromeOptions()
    driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
    driver.get(url)
    time.sleep(6)

    #I will do some operations with the page source here

    driver.close()

urls = ["https://www.youtube.com/watch?v=FWMIPukvdsQ", "https://www.youtube.com/watch?v=Ot4qdCs54ZE"]

for url in urls :
    Scrap(url)

一切正常,但我必须安装两次驱动程序,这很烦人。当我从数百个网站抓取数据时,我认为它大大减慢了程序的速度。而且感觉很糟糕。我尝试了两种方法,只安装一次驱动程序,并在各种功能和循环中使用它。

方法一:手动分配路径:

def update_driver():
    driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())

然后,输出会包含安装驱动的路径,我会手动复制并赋值给一个变量,以便其他爬虫功能可以使用。

方法 1 的问题: 我必须复制并粘贴它。有没有办法让它自动化?也许我可以得到安装的输出并过滤它?

方法二: 使驱动程序成为全局变量。 方法二的问题:当驱动被多个url.

使用时会报错

问题

  • 您正在 scrap 方法中使用驱动程序,这使得它启动浏览器的次数与 len(URLs)

    一样多
  • 您在 scrap 方法中关闭浏览器 driver.close,这应该在循环之后完成。

解决方案

driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())


def Scrap(url):
    driver.get(url)
    time.sleep(1)

    # I will do some operations with the page source here


urls = ["https://www.youtube.com/watch?v=FWMIPukvdsQ", "https://www.youtube.com/watch?v=Ot4qdCs54ZE"]

for url in urls:
    Scrap(url)

driver.close()