2017-06-27 4 views
0

Ich habe eine Liste von 8000 Website-URLs. Ich möchte den Text von den Websites abkratzen und alles als csv-Datei speichern. Um dies zu tun, wollte ich jede Textseite in einer Liste speichern. Dies ist mein bisheriger Code, der produziert und "MemoryError".Speicherfehler beim Anhängen zur Liste in Python

import os 
from splinter import * 
import csv 
import re 
from inscriptis import get_text 
from selenium.common.exceptions import WebDriverException 


executable_path = {'executable_path' :'./phantomjs'} 
browser = Browser('phantomjs', **executable_path) 
links = [] 


with open('./Hair_Salons.csv') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',') 
    for row in spamreader: 
     for r in row: 
      links.append(r) 

for l in links: 
    if 'yelp' in l: 
     links.remove(l) 

df = [] 

for k in links: 
    temp = [] 
    temp2 = [] 
    browser.visit(k) 

    if len(browser.find_link_by_partial_text('About'))>0: 
     about = browser.find_link_by_partial_text('About') 
     print(about['href']) 
     try: 
      browser.visit(about['href']) 
      temp.append(get_text(browser.html)) # <----- This is where the error is occuring 
     except WebDriverException: 
      pass 
    else: 
     browser.visit(k) 
     temp.append(get_text(browser.html)) 
    for s in temp: 
     ss = re.sub(r'[^\w]', ' ', s) 
     temp2.append(ss) 

    temp2 = ' '.join(temp2) 
    print(temp2.strip()) 

    df.append(temp2.strip()) 

with open('Hair_Salons text', 'w') as myfile: 
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) 
    wr.writerow(df) 

Wie kann ich vermeiden, einen Speicherfehler zu bekommen?

+1

Senden Sie die Daten während der Schleife in eine Datei, anstatt sie alle später zu speichern – doctorlove

+0

@doctorlove Wie würde ich das tun? Ich habe es versucht, aber scheinen meine Datei jedes Mal zu überschreiben, wenn die Schleife Schleifen. – briyan

+0

Sie sollten Ihren "Browser = Browser ('phantomjs', ** ausführbarer_Pfad)" jedes Mal löschen, wenn Sie zur nächsten Site weitergehen. Etwas wie "driver.quit()". Dies ist wahrscheinlich Ihr Speicherproblem. – chocksaway

Antwort

1

Wenn Sie nicht alle Ihre Daten im Speicher halten können, dann nicht. Auf einem hohen Niveau, Ihr Code hat diese Struktur

for k in links: 
    temp = [] 
    temp2 = [] 
    browser.visit(k) 

    # do stuff that fills in temp 

    for s in temp: 
     ss = re.sub(r'[^\w]', ' ', s) 
     temp2.append(ss) 

    temp2 = ' '.join(temp2) 
    print(temp2.strip()) 

    df.append(temp2.strip()) 

with open('Hair_Salons text', 'w') as myfile: 
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) 
    wr.writerow(df) 

Also, Sie viele Sachen in einem Datenrahmen setzen, dann schreiben Sie es - Sie es nicht in der Schleife verwenden. Anstelle der df.append(temp2.strip()) schreiben Sie dort in die Datei. Sie können die Datei entweder einmal öffnen, außerhalb der Schleife (möglicherweise sinnvoller) oder zum Anhängen öffnen (mit 'a' anstelle von 'w').

+0

Ich denke, ich verstehe, aber die Datei wird nicht jedes Mal geöffnet, wenn die Schleife läuft ab jetzt tut es? Ich hatte den Eindruck, dass es einmal geöffnet wird, sobald alle Texte in df sind. Das Speicherproblem scheint bei temp.append (get_text (browser.html)) zu liegen – briyan

+0

Das ist richtig - Sie scheinen die Datei einmal zu öffnen, nachdem (versucht) alle Daten in den Speicher zu lesen. Ich schlage vor, es einmal vor der Schleife zu öffnen, um Daten zu lesen und Zeile für Zeile zu schreiben. Oder möglicherweise in der Schleife wieder öffnen, aber das ist ein bisschen dämlich. – doctorlove

+0

In Ordnung, ich werde versuchen, wenn ich nach Hause komme, und akzeptiere dies, wenn es funktioniert! – briyan