2017-05-03 1 views
0

Ich versuche, mehr als 3000 Websites mit schönen Suppe in Python zu kratzen. Mein Code hat für ungefähr 50 Webseiten funktioniert, wird aber hängen bleiben, wenn ich 1000 oder 3000+ gleichzeitig laufen lasse.Scraping Texte mit schönen Suppe in Python - warum funktioniert nicht Bulk-Adressen

Es ist merkwürdig, dass der Code für mehrere Websites nicht funktioniert, ich würde gerne einen Rat bekommen, wie man Probleme damit macht. Ist das normal oder gibt es einen anderen Weg?

Wenn ich 1000 laufen lasse, liefert es auch nach 6 oder 7 Stunden keine Ergebnisse, also vermute ich, dass der Code überhaupt nicht funktioniert. Ich würde gerne ein paar Kommentare bekommen.

Code:

import csv 
d = csv.DictReader(open('file.csv', 'rU')) 

soc = [] 
for row in d: 
    soc.append(row) 

import sys 
reload(sys) 
sys.setdefaultencoding('utf8') 

from bs4 import * 
import time 
import requests 
import urllib2 

# create lists 
mega = [] 
mega2 = [] 
mega3 = [] 


for i in range(len(soc)): # all links, about 3000 
    myurl = soc[i]['report_url'] 
    try: 
     html = urllib2.urlopen(myurl).read() 
    except urllib2.HTTPError, error: 
     continue 
    except urllib2.URLError, error: 
     continue 
    soup = BeautifulSoup(html, "html.parser") 
    row = soup.findAll('tr') 
    for r in row: 
     mega.append([r.get_text()]) # force all raw text into a list in list 
     mega2 = [x[0] for x in mega] 
    mega3.append(mega2) 
    time.sleep(2) 
+0

Haben Sie überprüft, ob Sie von Ihrem IPS oder ihrer CDN/Firewall blockiert werden? – VMRuiz

+0

Fügen Sie einige Druckanweisungen hinzu, um zu sehen, wo es stecken bleibt. Eine Möglichkeit wäre, zwischen jeder Zeile einen hinzuzufü- gen und nur 1 ... n auszudrucken. – Lexxxxx

+0

@Lexxxxxx Können Sie genauer sein? Wie kann ich Python mitteilen, wo es hängen bleibt? – song0089

Antwort

0

Wenn Ihr Code für 50 Websites funktioniert, dann gibt es zwei Möglichkeiten: (1) Es gibt einen Link in Ihrer Liste, die Daten hat, die nicht ist, was der Code erwartet. (2) Sie haben keine Ressourcen mehr. Lassen Sie das Programm den zu scannenden Link und einen Zeitstempel anzeigen. Wenn die Ausgabe stoppt, dann ist die letzte Verbindung das Problem. Wenn die Zeitstempel immer weiter auseinander gehen, dann sind Ressourcen das Problem.

+0

Ich habe eine Möglichkeit gefunden, den Link und den Zeitstempel zu drucken. Es scheint, dass die ungefähre Zeit für das Scraping 5 Sekunden beträgt. – song0089

+0

Gibt es eine Möglichkeit, den Code zu stoppen, wenn die Zeit zu lange dauert? zum Beispiel kann ich etwas wie hinzufügen, wenn die Zeit mehr als 15 Sekunden für eine Verbindung dauert. – song0089

+0

Sie können eine Zeitüberschreitung für urlopen() festlegen. 'html = urllib2.urlopen (myurl, timeout = 5) .read()' – Lexxxxx

Verwandte Themen