【问题标题】:Selenium and multiprocessing in pythonpython中的硒和多处理
【发布时间】:2013-01-01 00:00:20
【问题描述】:

在我的 django 应用程序中,我使用 selenium 来抓取和解析一些 html 页面。我试图引入多进程来提高性能。这是我的代码:

import os
from selenium import webdriver
from multiprocessing import Pool

os.environ["DISPLAY"]=":56017"

def render_js(url):
    driver = webdriver.Firefox()
    driver.set_page_load_timeout(300)
    driver.get(url)
    text = driver.page_source
    driver.quit()
    return text

def parsing(url):
    text = render_js(url)
    ... parsing the text ....
    ... write in db.... 


url_list = ['www.google.com','www.python.com','www.microsoft.com']
pool = Pool(processes=2)
pool.map_async(parsing, url_list)
pool.close()
pool.join()

当两个进程同时工作并使用 selenium 时出现此错误:第一个进程使用“www.google.it”启动 firefox 并返回正确的文本,第二个使用 url“www.python.com”返回www.google.it 的文本,而不是 www.python.com 的文本。你能告诉我哪里错了吗?

【问题讨论】:

  • 您绝对不需要使用 Selenium 来抓取页面的 HTML - 这可能是您的性能问题所在 - 您的工作不需要 Selenium。
  • @Arran 我有很多带有 javascript 的页面,而 selenium 是我所知道的最好的解决方案......如果我将 selenium 用于单个任务,那么一切都可以与其他仪器的性能完美配合。然而,现在 url 的数量正在增加很多,并且想找到一种方法来通过多处理获得更高的性能......我该怎么办?
  • 您在测试中使用 Firefox。我建议试试 PhantomJS 而不是“Webdriver.PhantomJS”
  • 您正试图与多个进程共享同一个实例。您需要为您创建的每个进程创建一个新实例

标签: python django selenium multiprocessing


【解决方案1】:
from selenium import webdriver
from multiprocessing import Pool

def parsing(url):
    driver = webdriver.Chrome()
    driver.set_page_load_timeout(300)
    driver.get(url)
    text = driver.page_source
    driver.close()
    return text

url_list = ['http://www.google.com', 'http://www.python.com']
pool = Pool(processes=4)
ret = pool.map(parsing, url_list)
for text in ret:
    print text[:30]

我尝试运行您的代码,但 Selenium 抱怨 URL 错误。添加http:// 使其工作。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多