当前位置: 首页 > 面试题库 >

Pythonselenium多处理

燕翼
2023-03-14
问题内容

我用python与selenium结合编写了一个脚本,以从其着陆页中抓取不同文章的链接,并通过跟踪引向其内页的url最终获得每个文章的标题。尽管我在这里解析的内容是静态内容,但我还是使用了selenium来查看它在多处理中的工作方式。

但是,我的意图是使用多处理进行抓取。到目前为止,我知道selenium不支持多处理,但似乎我错了。

我的问题:当使用多处理运行selenium时,如何减少使用selenium的执行时间?

This is my try (it's a working one)

import requests
from urllib.parse import urljoin
from multiprocessing.pool import ThreadPool
from bs4 import BeautifulSoup
from selenium import webdriver

def get_links(link):
  res = requests.get(link)
  soup = BeautifulSoup(res.text,"lxml")
  titles = [urljoin(url,items.get("href")) for items in soup.select(".summary .question-hyperlink")]
  return titles

def get_title(url):
  chromeOptions = webdriver.ChromeOptions()
  chromeOptions.add_argument("--headless")
  driver = webdriver.Chrome(chrome_options=chromeOptions)
  driver.get(url)
  sauce = BeautifulSoup(driver.page_source,"lxml")
  item = sauce.select_one("h1 a").text
  print(item)

if __name__ == '__main__':
  url = "https://stackoverflow.com/questions/tagged/web-scraping"
  ThreadPool(5).map(get_title,get_links(url))

问题答案:

当使用多处理运行硒时,如何减少使用硒的执行时间

解决方案中的很多时间都花在为每个URL启动Webdriver上。您可以通过每个线程仅启动一次驱动程序来减少此时间:

(... skipped for brevity ...)

threadLocal = threading.local()

def get_driver():
  driver = getattr(threadLocal, 'driver', None)
  if driver is None:
    chromeOptions = webdriver.ChromeOptions()
    chromeOptions.add_argument("--headless")
    driver = webdriver.Chrome(chrome_options=chromeOptions)
    setattr(threadLocal, 'driver', driver)
  return driver


def get_title(url):
  driver = get_driver()
  driver.get(url)
  (...)

(...)

在我的系统上,这将时间从1m7s减少到仅24.895s,减少了约35%。要测试自己,请下载完整脚本。

注意:ThreadPool使用受Python GIL约束的线程。如果大多数情况下任务是受I /
O约束的,那没关系。根据您对抓取的结果进行的后处理,您可能需要使用a
multiprocessing.Pool。这将启动并行进程,这些进程作为一个整体不受GIL的约束。其余代码保持不变。



 类似资料:
  • 问题内容: 我在python中有以下代码 我的问题是在test_home_page函数之后,firefox实例关闭并为下一个test_whatever函数再次打开。我该怎么做,以便所有测试用例都从同一firefox实例执行。 问题答案: 在以下位置初始化firefox驱动程序:

  • 问题内容: 我创建了一个小的屏幕抓取器,并且一切似乎都运行良好,信息被提取并保存在数据库中。我唯一遇到的问题是有时Python不使用,因此它尝试在错误的页面上获取信息并崩溃。我尝试添加一个,但有时仍然无法正常工作。我正在尝试对其进行优化,以尽可能减少时间。因此,使其hibernate30秒似乎不是一个好的解决方案。 问题答案: 这是最好的解决方案。不能保证back()和forward()方法有效。

  • 问题内容: 我一直在努力找出我的代码发生了什么,但我无能为力。每当我运行程序时,都会在以下图片中出现此错误。我正在使用python 3.4.4和它的selenium最新版本。 Windows 10 错误图片 问题答案: 您没有提到您的FF版本是什么,我认为它是最新的。无论如何,您都需要使用低于47的FF或有时间切换到MarionetteDriver 这是一些有用的信息Selenium 2.53在F

  • 问题内容: 我正在尝试使用pythonselenium登录到网页。我找到了一个元素并将其启用,但是当我尝试向其发送send_keys()时出现错误。错误输出的主要内容(我认为)是 我的代码是 输出是 那么,我该怎么办? 问题答案: 为了使用户名字段可见,您需要将光标移动到登录链接:

  • 问题内容: 我尝试在exe文件中构建我的pythonselenium测试,并在许多机器上运行它,以使测试独立于环境。但是结果 .exe文件找不到seleniumwebdriver。如何在 .exe文件中包含所有selenium依赖关系?也许还有其他方法吗?是否可以制作虚拟环境并进行分发? 问题答案: 我假设您正在使用py2exe生成exe。您需要在setup.py文件中指定Selenium Web

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind