2017-10-21 69 views
1

Donc j'essaie de gratter les titres de here. Pour toutes les 10 années.Python - augmenter la vitesse du code Pandas.append

years est une liste ici qui contient

/resources/archive/us/2007.html 
/resources/archive/us/2008.html 
/resources/archive/us/2009.html 
/resources/archive/us/2010.html 
/resources/archive/us/2011.html 
/resources/archive/us/2012.html 
/resources/archive/us/2013.html 
/resources/archive/us/2014.html 
/resources/archive/us/2015.html 
/resources/archive/us/2016.html 

Alors, que mon code fait ici, est-il ouvre chaque page de l'année, rassemble tous les liens de date et ouvre alors chacun individuellement et prend toutes les .text et ajoute chaque titre et la date correspondante comme une ligne à la dataframe headlines

headlines = pd.DataFrame(columns=["date", "headline"]) 

for y in years: 
    yurl = "http://www.reuters.com"+str(y) 
    response=requests.get(yurl,headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36', }) 
    bs= BeautifulSoup(response.content.decode('ascii', 'ignore'),'lxml') 

    days =[] 
    links = bs.findAll('h5') 
    for mon in links: 
     for day in mon.next_sibling.next_sibling: 
      days.append(day) 

    days = [e for e in days if str(e) not in ('\n')] 
    for ind in days: 
     hlday = ind['href'] 
     date = re.findall('(?!\/)[0-9].+(?=\.)', hlday)[0] 
     date = date[4:6] + '-' + date[6:] + '-' + date[:4] 
     print(date.split('-')[2]) 
     yurl = "http://www.reuters.com"+str(hlday) 
     response=requests.get(yurl,headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36', }) 
     if response.status_code == 404 or response.content == b'': 
      print('') 
     else: 
      bs= BeautifulSoup(response.content.decode('ascii', 'ignore'),'lxml') 
      lines = bs.findAll('div', {'class':'headlineMed'}) 
      for h in lines: 
       headlines = headlines.append([{"date":date, "headline":h.text}], ignore_index = True) 

Il faut toujours courir, donc plutôt que de courir la boucle, j'ai juste couru cette année pour l'/resources/archive/us/2008.html

Cela fait 3 heures et c'est encore en cours.

Depuis que je suis nouveau à Python, je ne comprends pas, ce que je fais mal, ou comment je peux faire mieux.

Se pourrait-il que le pandas.append prenne une éternité parce qu'il doit lire et écrire une plus grande dataframe chaque fois qu'il est exécuté?

+5

Ne pas appeler ajouter des centaines de fois. Au lieu de cela, maintenez une liste qui a 100 images de données distinctes, puis appelez finalement 'pd.concat'. –

Répondre

1

Vous utilisez cet anti-modèle:

headlines = pd.DataFrame() 
for for y in years: 
    for ind in days: 
     headlines = headlines.append(blah) 

Au lieu de cela, faites ceci:

headlines = [] 
for for y in years: 
    for ind in days: 
     headlines.append(pd.DataFrame(blah)) 

headlines = pd.concat(headlines) 

Un deuxième problème potentiel est que vous faites 3650 requêtes Web. Si j'utilisais un site comme celui-là, je ferais des accélérations pour ralentir les racleurs comme les vôtres. Vous trouverez peut-être préférable de collecter les données brutes une première fois, de les stocker sur votre disque, puis de les traiter dans un second passage. Ensuite, vous n'encourez pas le coût de 3650 requêtes Web chaque fois que vous avez besoin de déboguer votre programme.