【问题标题】:Mapping a List to concurrent.futures ends the task early? - Python将 List 映射到 concurrent.futures 提前结束任务? - Python
【发布时间】:2021-06-14 21:23:21
【问题描述】:

主要目标:我想在一个网站上抓取 N 条路径。我也想在 T 个线程数上执行此操作。

我可以成功运行的一个示例是每次使用 10 个线程或 10 个线程和 5 个线程执行 10 个路径。后者的问题是它打开了 5 个 chrome 浏览器,然后又打开了另外 5 个 chrome 浏览器。

我最理想的是拥有 5 个 chrome 浏览器(T 个线程),每个浏览器都有一个要通过的 id 列表。

在我下面链接的代码中,它成功地通过了每个列表的 index[0]。但是,一旦它到达下一个项目,它就会停止运行。

例如,它将运行路径 ID 1、2、3、4、5。但它将在路径/id=6、7、8、9、10 处停止。

功能:

import concurrent.futures

def pathCrawler(idList):
    DRIVER_PATH = 'chromedriver'
    driver = webdriver.Chrome(executable_path=DRIVER_PATH)
    path = 'fake.../id='
    

    for id in idList:
        print('start')
        driver.get(path + str(id))
        # Try Hitting #1 Button
        try:
            # XPath for #1 Button
            driver.find_element(By.XPATH, '').click() 
            print(f'{id}: success 1')

            #Try Hitting #2 Button 
            try:
                # XPath for #2 Button
                driver.find_element(By.XPATH, '').click()  
                print(f'{id}: success 2')
            except:
                print(f'{id} = Exception 2')
            

        except:
            print(f'Exception 1')
        print('end')
    
    return f'Done with {idList}'
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    df = [[1,6] , [2,7] , [3,8] , [4,9] , [5,10]]
    results = executor.map(pathCrawler, df)

有人有什么建议吗?

谢谢,

【问题讨论】:

  • 您在此处显示的代码在 for 循环之外执行 driver.get OUTSIDE。那真的是你所拥有的吗?如果是这样,那么id 是一个内置函数,而不是一个 ID 号。无论如何,我确定您希望在循环中使用 driver.get
  • 谢谢!这是我为堆栈溢出编辑它的最后一个错字。我会解决的。我正在使用的代码在循环中有 driver.get 。我在 for 循环的开头和结尾有两个打印语句。对于网页 1、2、3、4、5。他们将打印“开始”和“结束”,但第 6、7、8、9、10 页只会打印“开始”。
  • 找出问题所在,我在开始时进行了检查,阻止了流量。

标签: python multithreading concurrent.futures


【解决方案1】:

找出问题所在,我在开始时检查了阻塞流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 2023-04-08
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多