2016-09-06 1 views
-1

Je cours un programme pour tirer quelques informations de Yahoo! La finance. Il fonctionne très bien comme une boucle For, mais il prend beaucoup de temps (environ 10 minutes pour 7000 entrées), car il doit traiter chaque request.get(url) individuellement (ou je me trompe sur le bottlenecker majeur?)Multithreading à Scrap Yahoo Finance

Quoi qu'il en soit, je suis tombé sur multithread comme une solution potentielle. Voilà ce que j'ai essayé:

import requests 
import pprint 
import threading 

with open('MFTop30MinusAFew.txt', 'r') as ins: #input file for tickers 
    for line in ins: 
     ticker_array = ins.read().splitlines() 

ticker = ticker_array 
url_array = [] 
url_data = [] 
data_array =[] 

for i in ticker: 
    url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/'+i+'?formatted=true&crumb=8ldhetOu7RJ&lang=en-US&region=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com' 
    url_array.append(url) #loading each complete url at one time 

def fetch_data(url): 
    urlHandler = requests.get(url) 
    data = urlHandler.json() 
    data_array.append(data) 

pprint.pprint(data_array) 

threads = [threading.Thread(target=fetch_data, args=(url,)) for url in url_array] 

for thread in threads: 
    thread.start() 
for thread in threads: 
    thread.join() 

fetch_data(url_array) 

L'erreur que je reçois est InvalidSchema: No connection adapters were found for '['https://query2.finance.... [url continues].

PS. J'ai également lu que l'utilisation de l'approche multithread pour scrapper des sites Web est mauvaise/peut vous bloquer. Would Yahoo! Finances esprit si je tire des données de quelques milliers de tickers à la fois? Rien ne s'est passé quand je les ai fait séquentiellement.

+0

Je rappellerai qu'un [package Python existe déjà] (https://pypi.python.org/pypi/yahoo-finance/1.1.4) sur Pypi pour faire des requêtes à Yahoo! la finance. Cela ne vous aidera pas à faire plus de demandes plus rapidement, mais ce sera beaucoup plus agréable que d'avoir à écrire votre propre logique pour obtenir des valeurs. –

+0

J'ai vu ça! Mais ils n'ont pas de méthodes pour tous les chiffres dont j'ai besoin. –

Répondre

2

Si vous regardez attentivement l'erreur, vous remarquerez qu'elle ne montre pas une URL mais toutes les URL que vous avez ajoutées, entourées de parenthèses. En effet, la dernière ligne de votre code appelle réellement votre méthode fetch_data avec le tableau complet en paramètre, ce qui n'a aucun sens. Si vous supprimez cette dernière ligne, le code fonctionne très bien et vos threads sont appelés comme prévu.