2017-07-20 4 views
0

Wer hat eine Idee, was ist los mit dem unten stehenden Code? Es greift die Daten von nur einem Tag. Die Webseite ist jedoch eine dynamische Web-Datenbank und enthält Daten für eine Reihe von Jahren. Ich muss die Daten für jeden Monat und jeden Tag im Zeitraum 2013-2016 abkratzen und in einer CSV-Datei speichern.Dynamische Web-Datenbank Scraping in Python

import calendar 
import requests 
from bs4 import BeautifulSoup 

cal = calendar.Calendar() 

base_url = 'http://www.pse.pl/index.php?modul=21&id_rap=24&data=2016' 
month_url = '&Month=' 
day_url = '&Day=' 

for year in range(2015, 2017): 
    for month in range(1, 13): 
     monthdays = [d for d in cal.itermonthdays(year, month) if d != 0] 
     for day in monthdays: 
      r = requests.get(base_url + str(year) + month_url + str(month) + day_url + str(day)) 
      soup = BeautifulSoup(r.text,'lxml') 
      findtable = soup.find('table',{'id':'tabela'}) 
      for i in findtable.findAll('tr'): 
       for j in i.findAll('td'): 
        print (j.text) 

Antwort

0

Die Hauptsache ist, dass das Datum in der URL, die Sie an die Site senden, anders formatiert sein muss. Bindestriche sind zwischen Elementen des Datums (Jahr, Monat und Tag) erforderlich. Ich kann auch eine einfachere Art vorschlagen, sich durch die Tage zu bewegen.

Pfeile ist ein Modul zum Arbeiten mit Daten. In diesem Fall verwende ich es für die Erzeugung einer Reihe von Tagen vom 1. Januar 2015 bis einschließlich 3. Januar 2015.

Ich verwende es auch für die Formatierung dieser Daten.

Ich finde die Tabellen mit BeautifulSoup und dann Pandas zum Extrahieren des Inhalts der Tabellen in einen Datenrahmen. Schließlich schreibe ich diese Datenframes in CSV-Dateien.

>>> import requests 
>>> import arrow 
>>> import bs4 
>>> from datetime import datetime 
>>> import pandas as pd 
>>> start = arrow.get(datetime(2015,1,1)) 
>>> end = arrow.get(datetime(2015,1,3)) 
>>> base_url = 'http://www.pse.pl/index.php?modul=21&id_rap=24&data=' 
>>> for day in arrow.Arrow.range('day', start, end): 
...  page = requests.get(base_url+day.format('YYYY-MM-DD')).content 
...  soup = bs4.BeautifulSoup(page, 'lxml') 
...  table = soup.find('table' ,{'id':'tabela'}) 
...  df = pd.read_html(str(table)) 
...  df[0].to_csv(day.format('YYYY-MM-DD')+'.csv') 
+0

Vielen Dank für Ihre Antwort. Ich mag die Art, wie Sie meinen Code geändert haben. Ich denke ich verstehe, wie es funktioniert. Ich habe unten eine weitere Ausgabe hinzugefügt, von der Sie wahrscheinlich wissen, wie sie zu lösen ist. – taumar

+0

@ taumar: Sie sollten dies bitte als separate Frage stellen. (Lassen Sie es mich wissen, wenn Sie es tun, und ich werde eine Antwort geben, wenn niemand sonst etwas tut.) Aller Wahrscheinlichkeit nach werden die echten Pandas-Experten hier auf SO Ihnen eine viel bessere Antwort geben können, als ich kann. –

0

Sie können mit BeautifulSoup nicht vor Ort "klicken".

In diesem Fall sehe ich 2 Möglichkeiten:

1) Entdecken Sie selenium Modul mit der Website zu interagieren.

2) Beachten Sie, dass Links dieser Art sind:

http://www.pse.pl/index.php?modul=21&id_rap=24&data=2017-07-19. Teil Interetsing hier ist & data = 2017-07-19

Sie können eine Schleife bauen, die an den Schweif Basis Link ein konkretes Datum passiert und mit requests jeder solcher Links zu öffnen. Und Parsing geht weiter.