Мне нужно провести небольшое исследование рынка недвижимости, а для этого мне нужны цены и другие ценности новых домов.
Так что моя идея состояла в том, чтобы пойти на веб-сайт, где я получить информацию. Перейдите на основной сайт поиска и соскребите все RealEstateID, которые перенаправят меня прямо на отдельные страницы для каждого дома, где я могу извлечь нужную мне информацию.
Моя проблема заключается в том, как мне получить все идентификаторы недвижимости с главной страницы и сохранить их в списке, чтобы я мог использовать их на следующем шаге, чтобы создать с ними URL-адреса для перехода на актуальные сайты.
Я попробовал это с BeautifulSoup, но потерпел неудачу, потому что я не понимаю, как искать определенное слово и извлекать то, что идет после него.
HTML-код выглядит следующим образом:
""realEstateId":110356727,"newHomeBuilder":"false","disabledGrouping":"false","resultlist.realEstate":{"@xsi.type":"search:ApartmentBuy","@id":"110356727","title":"
Поскольку значение «realEstateId» появляется около 60 раз, я хочу всегда очищать число (здесь: 110356727), которое следует за ним, и сохранять его в списке, чтобы я мог использовать его позже.
Редактировать:
import time
import urllib.request
from urllib.request import urlopen
import bs4 as bs
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
import os
import pandas as pd
import pandas_datareader.data as web
import pickle
import requests
from requests import get
url = 'https://www.immobilienscout24.de/Suche/S-T/Wohnung-Kauf/Nordrhein-Westfalen/Duesseldorf/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/true?enteredFrom=result_list'
response = get(url)
from bs4 import BeautifulSoup
html_soup = BeautifulSoup(response.text, 'html.parser')
type(html_soup)
def expose_IDs():
resp = requests.get('https://www.immobilienscout24.de/Suche/S-T/Wohnung-Kauf/Nordrhein-Westfalen/Duesseldorf/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/true?enteredFrom=result_list')
soup = bs.BeautifulSoup(resp.text, 'lxml')
table = soup.find('resultListModel')
tickers = []
for row in table.findAll('realestateID')[1:]:
ticker = row.findAll(',')[0].text
tickers.append(ticker)
with open("exposeID.pickle", "wb") as f:
pickle.dump(tickers, f)
return tickers
expose_IDs()
Что-то вроде этого? В словаре есть 68 ключей, которые являются идентификаторами. Я использую регулярное выражение, чтобы получить тот же скрипт, что и вы, и удалить нежелательный символ, затем загрузить с помощью json.loads
и получить доступ к объекту json, как показано на изображении внизу.
import requests
import json
from bs4 import BeautifulSoup as bs
import re
res = requests.get('https://www.immobilienscout24.de/Suche/S-T/Wohnung-Kauf/Nordrhein-Westfalen/Duesseldorf/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/true?enteredFrom=result_list')
soup = bs(res.content, 'lxml')
r = re.compile(r'resultListModel:(.*)')
data = soup.find('script', text=r).text
script = r.findall(data)[0].rstrip(',')
#resultListModel:
results = json.loads(script)
ids = list(results['searchResponseModel']['entryInformation'].keys())
print(ids)
Идентификаторы:
С момента обновления сайта:
import requests
import json
from bs4 import BeautifulSoup as bs
import re
res = requests.get('https://www.immobilienscout24.de/Suche/S-T/Wohnung-Kauf/Nordrhein-Westfalen/Duesseldorf/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/true?enteredFrom=result_list')
soup = bs(res.content, 'lxml')
r = re.compile(r'resultListModel:(.*)')
data = soup.find('script', text=r).text
script = r.findall(data)[0].rstrip(',')
results = json.loads(script)
ids = [item['@id'] for item in results['searchResponseModel']['resultlist.resultlist']['resultlistEntries'][0]['resultlistEntry']]
print(ids)
можно, если быстро. Если это дольше и требует кода и html, лучше открыть новую тему.
Веб-сайт изменил HTML-код, и «entryInformation» больше нет. У вас есть какое-либо другое решение для изменения кода, чтобы я все еще получал все идентификаторы?
Конечно. Кажется, я вижу, где новые идентификаторы.
Пожалуйста, проверьте редактирование и убедитесь, что это то, что вы хотели.
Да, это работает тихий код, я думаю, что я получаю не все идентификаторы, а 50%, так как теперь у меня возникают проблемы в других областях, я открою новую ветку. Спасибо!
Тогда один момент, пожалуйста.
Можете ли вы дать мне отсутствующее значение идентификатора?
"111310689" например. последний на странице
то есть в выводе списка Это последнее/
эй извините за задержку ответа. Я просто получаю 20 идентификаторов в качестве вывода, но страница содержит 60. Похоже, скрипт скоро остановится.
пожалуйста, предоставьте мне отсутствующий идентификатор, найденный на странице, но не в ответе выше.
Все это Например: "105147583 103639187 89145037 111337199 96836280 101618556 101618055 101617574 102721369 108761945 110914846 108761466 108761117 111148131 111147712 111147267"
Привет, есть шанс поболтать с тобой
@CosmoCramer Да, но только сегодня вечером, если только это не займет буквально 1 минуту.
эй, я не хочу открывать новую тему, и, поскольку вы так мне помогли в прошлый раз, я подумал, что спрошу вас здесь напрямую. Веб-сайт изменил HTML-код, и «entryInformation» больше нет. У вас есть какое-либо другое решение для изменения кода, чтобы я все еще получал все идентификаторы?