2017-12-29 42 views
0

私は多数のURLにウェブスクレイピングを使用しようとしています。スピードアップするためにマルチプロセッシングを適用しますが、なぜ高速化できないのか分かりません。ここに私のコードの一部です:ウェブスクレイピングマルチプロセッシングが動作しない

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]) 
    ... 
# function for scraping the data from url 

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() 

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 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=6) 
    records = p.map(scrap(url,output_path)) 

    p.terminate() 
    p.join() 

ウェブスクレイピング使用してマルチプロセッシングをスピードアップする方法がわかりません。

答えて

0

あなたは実際にマルチプロセッシングを使用していません。 scrap関数を1回実行し、その結果を引数としてp.map()に渡しています。代わりに、1つの引数を取る呼び出し可能な関数を渡す必要があります。

func = lambda url: scrap(url, output_path) 
p.map(func, list_of_urls) 
+0

共有していただきありがとうございます。ただし、コードを変更しても、速度は向上しません。 '場合__name__ == '__main__': プール= multiprocessing.Pool(プロセス= 6) FUNC =ラムダURL:スクラップ(URL、output_path) p.map(FUNC、URLの) p.terminate() P .join() ' –

+0

すみませんが、私はPythonとマルチプロセッシングにはかなり新しいです。 –

+0

テストコードでマルチプロセッシングを正常に使用しましたか? – wkzhu