0

Ich habe mit Web-Scraping mit BeautifulSoup getan und speichern Sie erfolgreich die geparsten Daten in CSV-Dateien, aber ich möchte den Prozess beschleunigen, so dass ich Multiprocessing verwenden. Aber es gibt keinen Unterschied, nachdem ich Multiprocessing im Skript angewendet habe. Hier ist mein CodeMutiprocessing funktioniert nicht in Python Web-Scrapping

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) 

einfach den Code aktualisieren und das Problem ist jetzt die CPU-Auslastung 100% nur am Anfang erreichen, aber bald wird auf 1% gesenkt. Ich bin ziemlich verwirrt darüber.

+0

starten Sie einen und nur einen Thread, nicht verarbeiten und nicht multi. – georgexsh

Antwort

0

Ohne auf Details in Ihrem Code zu gehen: Sie können von einem Blick auf das joblib Modul profitieren.

Pseudocode:

import joblib 

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

Code Refactoring notwendig sein kann, weil JOBLIB funktioniert nur, wenn kein Code ausgeführt wird außerhalb jeder def: und if __name__ == "__main__": -Zweig.

n_jobs=-1 startet eine Anzahl von Prozessen, die der Anzahl der Kerne auf Ihrer Maschine entsprechen. Weitere Informationen finden Sie in documentation von joblib.

Mit diesem Ansatz zusammen mit Selen/Geckodriver, ist es möglich, einen Pool von 10k URLs in weniger als einer Stunde abhängig von Ihrer Maschine zu kratzen (Ich öffne 40-50 Prozesse auf einem Octacore-Rechner mit 64GB RAM).

+0

Danke für das Teilen. Nach dem Ändern des Codes, wie Sie vorschlagen, kann ich sehen, dass alle CPUs verwendet werden, aber das geschieht nur zu Beginn. Wenn ich das Programm benutze, beträgt die Auslastung der CPU 100%, wird aber bald auf 1% fallen. Weißt du, wie das zu beheben ist? Vielen Dank. –

+0

Bitte zögern Sie nicht, Ihre Frage zu bearbeiten, so dass es ein reduktives Beispiel Ihres aktuellen, aktualisierten Codes – sudonym

+0

enthält Aktualisieren Sie einfach den Code, fühlen Sie sich frei, es auszuprobieren. Vielen Dank –

Verwandte Themen