Per prima cosa, dovresti provare i pacchetti multithreading/multiprocessing. Attualmente, i tre più popolari sono multiprocessing; concurrent.futures e [threading] [3]. Questi pacchetti potrebbero aiutarti ad aprire più url contemporaneamente, il che potrebbe aumentare la velocità.
Ancora più importante, dopo aver utilizzato l'elaborazione multithread e se si tenta di aprire centinaia di URL contemporaneamente, si noterà che urllib.request.urlopen è molto lento e l'apertura e la lettura del contesto diventano la parte che richiede più tempo . Quindi, se vuoi renderlo ancora più veloce, dovresti provare i pacchetti request, request.get (url) .content() è più veloce di urllib.request.urlopen (url) .read().
Quindi, qui elencho due esempi per l'analisi veloce multi url e la velocità è più veloce rispetto alle altre risposte. Il primo esempio utilizza il classico pacchetto di threading e genera centinaia di thread allo stesso tempo. (Un difetto banale è che non può mantenere l'ordine originale del ticker.)
import time
import threading
import pandas as pd
import requests
from bs4 import BeautifulSoup
ticker = pd.ExcelFile('short_tickerlist.xlsx')
ticker_df = ticker.parse(str(ticker.sheet_names[0]))
ticker_list = list(ticker_df['Ticker'])
start = time.time()
result = []
def fetch(ticker):
url = ('http://finance.yahoo.com/quote/' + ticker)
print('Visit ' + url)
text = requests.get(url).content
soup = BeautifulSoup(text,'lxml')
result.append([ticker,soup])
print(url +' fetching...... ' + str(time.time()-start))
if __name__ == '__main__':
process = [None] * len(ticker_list)
for i in range(len(ticker_list)):
process[i] = threading.Thread(target=fetch, args=[ticker_list[i]])
for i in range(len(ticker_list)):
print('Start_' + str(i))
process[i].start()
# for i in range(len(ticker_list)):
# print('Join_' + str(i))
# process[i].join()
print("Elapsed Time: %ss" % (time.time() - start))
Il secondo esempio utilizza pacchetto multiprocessore, ed è poco più semplice. Poiché devi solo indicare il numero di pool e mappare la funzione. L'ordine non cambierà dopo aver recuperato il contesto e la velocità è simile al primo esempio ma molto più veloce rispetto ad altri metodi.
from multiprocessing import Pool
import requests
from bs4 import BeautifulSoup
import pandas as pd
import os
import time
os.chdir('file_path')
start = time.time()
def fetch_url(x):
print('Getting Data')
myurl = ("http://finance.yahoo.com/q/cp?s=%s" % x)
html = requests.get(myurl).content
soup = BeautifulSoup(html,'lxml')
out = str(soup)
listOut = [x, out]
return listOut
tickDF = pd.read_excel('short_tickerlist.xlsx')
li = tickDF['Ticker'].tolist()
if __name__ == '__main__':
p = Pool(5)
output = p.map(fetch_url, ji, chunksize=30)
print("Time is %ss" %(time.time()-start))
Cosa ti fa pensare che 'open' sia lento? BeautifulSoup (tanto utile quanto è) fa molto più lavoro e presumo che sia il collo di bottiglia nel codice. Hai provato senza analizzare? Un esempio di codice qui sarebbe d'aiuto. – msw
Non basta PHP, non servirà. Python ha un sacco di spazio per essere veloce, hai solo bisogno di ottimizzare il tuo codice. – bwawok
Oh sparare, quindi la cosa da infilare non va bene? Grazie per il passaggio su –