2017-09-17 2 views
0

Ich versuche, alle PGN's von diesem site herunterladen.Python Download mehrere Dateien

Ich denke, ich muss urlopen verwenden, um jede URL zu öffnen und dann urlretrieve verwenden, um jedes pgn herunterzuladen, indem Sie auf den Download-Knopf nahe dem Boden jedes Spiels zugreifen. Muss ich für jedes Spiel ein neues BeautifulSoup Objekt erstellen? Ich bin mir auch nicht sicher, wie urlretrieve funktioniert.

import urllib 
from urllib.request import urlopen, urlretrieve, quote 
from bs4 import BeautifulSoup 

url = 'http://www.chessgames.com/perl/chesscollection?cid=1014492' 
u = urlopen(url) 
html = u.read().decode('utf-8') 

soup = BeautifulSoup(html, "html.parser") 
for link in soup.find_all('a'): 
    urlopen('http://chessgames.com'+link.get('href')) 

Antwort

0

Es gibt keine kurze Antwort auf Ihre Frage. Ich werde Ihnen eine komplette Lösung zeigen und diesen Code kommentieren.

Zunächst importieren notwendigen Module:

from bs4 import BeautifulSoup 
import requests 
import re 

Als nächstes Index-Seite erhalten und BeautifulSoup Objekt erstellen:

req = requests.get("http://www.chessgames.com/perl/chesscollection?cid=1014492") 
soup = BeautifulSoup(req.text, "lxml") 

ich dringend raten lxml Parser zu verwenden, nicht gemeinsam html.parser Danach werden Sie sollte die Linksliste des Spiels vorbereiten:

pages = soup.findAll('a', href=re.compile('.*chessgame\?.*')) 

Sie können dies tun, indem Sie Links mit dem Wort "chessgame" darin suchen. Nun sollten Sie Funktion herzustellen, die Dateien für Sie herunterladen werden:

def download_file(url): 
    path = url.split('/')[-1].split('?')[0] 
    r = requests.get(url, stream=True) 
    if r.status_code == 200: 
     with open(path, 'wb') as f: 
      for chunk in r: 
       f.write(chunk) 

und letzte Magie alle bisherigen Schritte der Vorbereitung Links für Datei-Downloader wiederholen:

host = 'http://www.chessgames.com' 
for page in pages: 
    url = host + page.get('href') 
    req = requests.get(url) 
    soup = BeautifulSoup(req.text, "lxml") 
    file_link = soup.find('a',text=re.compile('.*download.*')) 
    file_url = host + file_link.get('href') 
    download_file(file_url) 

(zuerst suchen Sie Links Text enthält 'download' in ihrer Beschreibung, dann Konstruieren vollständige URL - verketten Hostname und Pfad, und schließlich Download-Datei)

Ich hoffe, Sie können diesen Code ohne Korrektur verwenden!

+0

Danke, funktioniert hervorragend! –

+0

Warum sollte ich Anfragen und nicht urllib übrigens verwenden? Kannst du das gleiche mit Urllib machen? –

+0

Natürlich können Sie 'urllib' verwenden, wie Sie es in Ihrer Frage getan haben. Aber 'Anfragen' sind eine gute Übung. Sie können zusätzliche Informationen erhalten [hier] (https://stackoverflow.com/questions/2018026/what-are-the-differences-between-the-urllib-urllib2-and-requests-module) –