多重处理在python web-scraping中不起作用

时间:2017-12-07 03:56:10

标签: python multithreading web-scraping beautifulsoup multiprocessing

我已经完成了使用beautifulsoup进行网页抓取并成功将解析后的数据保存到csv文件中,但我想加快这个过程,所以我使用了多处理。但是在脚本中应用多处理之后没有区别。这是我的代码

class Dummy 
{

    public static void main (String[] args) throws InterruptedException {

        Dummy app = new Dummy();
        int n=10;

        for(int i=1; i<=n; i++)
        {
            System.out.println("--------------------------");
            System.out.println("Total for n:" + i +" = " + app.mod(i));
        }
    }

    private static int counter = 0;
    public long mod(int n)
    {   
        Dummy.counter++;

        if(counter == 1)
        {
            long total = 0;
            while(n>=0)
            {    
                total +=  mod(n);
                n--;
            }
            Dummy.counter--;
            return total;
        }

        long result = 0;
        long n1=0,n2=0;

        if(n >= 2 && n <=3)
            result++; //Increase 1
        else if(n>3)
        {
            n1 = mod(n-1);
            n2 = mod(n-2);

            result = n1*n1 + n2*n2;
        }

        Dummy.counter--;
        return result;
    }
}

只需更新代码,现在的问题是CPU利用率只能在开始时达到100%,但很快就会下降到1%。我对此很困惑。

1 个答案:

答案 0 :(得分:0)

不需要在代码中找到任何细节:您可以查看joblib模块。

<强>伪代码:

import joblib

if __name__ == "__main__":
      URLs = ["URL1", "URL2", "URL2", ...]
      Parallel(n_jobs=-1)(scrap(url,output_path) for url in URLs)

重构代码可能是必要的,因为如果没有代码在任何def:if __name__ == "__main__": - 分支之外运行,则joblib才有效。

n_jobs=-1将启动一系列与您计算机上的核心数相当的进程。有关详细信息,请参阅joblib&#39; documentation

与selenium / geckodriver一起使用这种方法,根据您的机器,可能在不到一个小时的时间内刮掉一个10k URL的池(我通常在具有64GB ram的octacore机器上打开40-50个进程)。