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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多处理在python web-scraping中不起作用相关的知识,希望对你有一定的参考价值。

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

rootPath = '....' 
urlp1 = "https://www.proteinatlas.org/"

try:
    df1 = pd.read_csv(rootPath + "cancer_list1_2(1).csv", header=0);
except Exception as e:
    print("File " + f + " doesn't exist")
    print(str(e))
    sys.exit()

cancer_list = df1.as_matrix().tolist()
# [["bcla_gene","beast+cancer"], ...]

URLs = []
for cancer in cancer_list:

    urlp2 = "/pathology/tissue/" + cancer[1]
    f = cancer[0]

    try:
        df1 = pd.read_csv(rootPath + f + ".csv", header=0);
    except Exception as e:
        print("File " + f + " doesn't exist")
        print(str(e))
        sys.exit()
    ... # list of urls

def scrap(url,output_path):
    page = urlopen(URL)
    soup = BeautifulSoup(page, 'html.parser')
    item_text = soup.select('#scatter6001 script')[0].text
    table = soup.find_all('table',{'class':'noborder dark'})
    df1 = pd.read_html(str(table),header = 0)
    df1 = pd.DataFrame(df1[0])
    Number = soup.find('th',text = "Number of samples").find_next_sibling("td").text 


...
#function of scraping



if __name__ == "__main__":

    Parallel(n_jobs=-1)(scrap(url,output_path) for url in URLs)

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

答案

无需在代码中查看任何细节:您可以从查看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__":-branch之外没有代码运行时,joblib才有效。

n_jobs=-1将启动一系列与您机器上的核心数相当的进程。有关更多详细信息,请参阅joblib的documentation

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

以上是关于多处理在python web-scraping中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

具有多处理锁的共享计数器在 Windows 中不起作用

多处理、动态嵌套管理器在 Windows 中不起作用(在 Mac 上很好)

Java——使用多线程从list中不重复地取出数据并进行处理,给多线程任务添加单项任务计时和总耗时

Java——使用多线程从list中不重复地取出数据并进行处理,给多线程任务添加单项任务计时和总耗时

为啥将命令输出定向到变量在批处理文件中不起作用

lambda函数在多进程中不起作用