Scrapen mit Beautiful Soup
Verfasst: Montag 18. Mai 2020, 20:17
Hallo liebe Community,
für ein Projekt habe ich mir vorgenommen die Daten zu den Häusern aus Immoscout24 mithilfe von BeautifulSoup zu scrapen und dann in einer CSV-Datei zu speichern, um die Daten später benutzen zu können. Ich habe bereits ein Skript geschrieben mit dem man die Dateien zu den Häusern bekommt. Das Programm funktioniert zwar einwandfrei, aber es dauert sehr lange und IDLE stürzt dabei immer ab. Wahrscheinlich liegt es daran, dass zuviel Speicher verbraucht wird. Um dieses Problem zu lösen habe ich versucht die Daten nicht alle auf einmal zu scrapen, sondern Bundesland für Bundesland, aber auch das hat nicht geklappt. Eine andere Idee wäre das Programm bezüglich des Speichers und der Laufzeit zu optimieren, doch dafür habe ich keine Möglichkeit gefunden. Für Lösungsansätze und Hinweise bezüglich der Lösung meines Problems wäre ich sehr dankbar.
für ein Projekt habe ich mir vorgenommen die Daten zu den Häusern aus Immoscout24 mithilfe von BeautifulSoup zu scrapen und dann in einer CSV-Datei zu speichern, um die Daten später benutzen zu können. Ich habe bereits ein Skript geschrieben mit dem man die Dateien zu den Häusern bekommt. Das Programm funktioniert zwar einwandfrei, aber es dauert sehr lange und IDLE stürzt dabei immer ab. Wahrscheinlich liegt es daran, dass zuviel Speicher verbraucht wird. Um dieses Problem zu lösen habe ich versucht die Daten nicht alle auf einmal zu scrapen, sondern Bundesland für Bundesland, aber auch das hat nicht geklappt. Eine andere Idee wäre das Programm bezüglich des Speichers und der Laufzeit zu optimieren, doch dafür habe ich keine Möglichkeit gefunden. Für Lösungsansätze und Hinweise bezüglich der Lösung meines Problems wäre ich sehr dankbar.
Code: Alles auswählen
import bs4 as bs
import urllib.request
import pandas as pd
from functools import reduce
df = []
bundesländer = ['baden-wuerttemberg','bayern','berlin/berlin','brandenburg','bremen','hamburg/hamburg','hessen','mecklenburg-vorpommern',
'niedersachsen','nordrhein-westfalen','rheinland-pfalz','saarland','sachsen','sachsen-anhalt','schleswig-holstein','thueringen']
def get_links(link):
# Links der einzelnen Häuser
soup = bs.BeautifulSoup(urllib.request.urlopen(link).read(),'html.parser')
a_tags = soup.find_all('a',class_='result-list-entry__brand-title-container')
return ['https://www.immobilienscout24.de'+a_tag['href']+'#/' for a_tag in a_tags]
def get_data(link):
# extrahiert die Daten eines Hauses
soup = bs.BeautifulSoup(urllib.request.urlopen(link).read(),'html.parser')
data = {}
house_data = soup.find('div',class_ = 'criteriagroup criteria-group--two-columns')
house_data_dt = house_data.find_all('dt')
house_data_dd = house_data.find_all('dd')
a_tags = soup.find_all('a',class_='breadcrumb__link')[1:]
keys = ['Bundesland','Stadt','Ort']
data['Kaufpreis'] = soup.find('div',class_ = 'is24qa-kaufpreis is24-value font-semibold is24-preis-value').text
data['Ort'] = soup.find('span',class_ = 'zip-region-and-country').text
for a_tag,key in zip(a_tags,keys):
data[key] = a_tag.text
for dt_tag_house,dd_tag_house in zip(house_data_dt,house_data_dd):
try:
data[dt_tag_house.text].append(dd_tag_house.text)
except KeyError:
data[dt_tag_house.text] = dd_tag_house.text
try:
building_data = soup.find('div',class_ = 'criteriagroup criteria-group--border criteria-group--two-columns criteria-group--spacing')
building_data_dt = building_data.find_all('dt')
building_data_dd = building_data.find_all('dd')
for dt_tag_building,dd_tag_building in zip(building_data_dt,building_data_dt):
try:
data[dt_tag_building.text].append(dd_tag_building.text)
except KeyError:
data[dt_tag_building.text] = dd_tag_building.text
except AttributeError:
pass
return data
def add_dictionary(dict1,dict2):
# fügt die Daten von zwei Häusern zusammen
missing_values = len(dict1['Kaufpreis'])*[None]
for key in dict2.keys():
try:
dict1[key].append(dict2[key])
except KeyError:
dict1[key] = missing_values+[dict2[key]]
for key in [i for i in dict1.keys() if i not in dict2.keys()]:
dict1[key].append(None)
return dict1
for bundesland in bundesländer:
main_link = 'https://www.immobilienscout24.de/Suche/de/'+bundesland+'/haus-kaufen'
number_pages = int(bs.BeautifulSoup(urllib.request.urlopen(main_link).read(),'html.parser').find_all('option')[-1].text)
sources = [main_link+'?pagenumber='+str(i) for i in range(1,number_pages+1)]
data = []
print(bundesland)
for source in sources:
print(source)
for sub_link in get_links(source):
print(sub_link)
# Print Statements dienen als Überprüfung, ob der COde funktioniert
try:
print(sub_link)
data.append(get_data(sub_link))
except urllib.error.URLError:
continue
print(data)
df.append(reduce(add_dictionary,data))
df = reduce(add_dictionary,df)
df = pd.DataFrame(df)