python - 如何从网页中抓取特定 ID
问题描述
我需要做一些房地产市场研究,为此需要新房子的价格和其他价值。
所以我的想法是去我获取信息的网站上。转到 Main-Search-Site 并抓取所有 RealEstateID,这些 RealEstateID 可以直接将我导航到每个房子的单个页面,而不是提取我需要的信息。
我的问题是如何从主页获取所有房地产 ID 并将它们存储在一个列表中,这样我就可以在下一步中使用它们来构建 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 个键是 id。我使用正则表达式来获取与您相同的脚本并修剪不需要的字符,然后加载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)
推荐阅读
- haskell - 在 Haskell 图中加载外部图像
- javascript - Javascript修改动态加载元素中的文本
- sql - 语法错误:意外的字符串文字“93868086.ga_sessions_”在 [1:244] - BigQuery
- c++ - 使用 OpenCV 从视频流中检测模糊的二维码
- javascript - 如何在另一个 API 的 ajax 调用中调用一个 API
- ubuntu - 应该通过软件包还是手动安装 cgal 4.12?(Ubuntu 17.10)
- database - 查找、浏览和搜索 (GET) 请求
- c# - C# SQL 插入疑难解答
- flask-sqlalchemy - Flask-Admin:在主键上添加过滤器
- java - Android 应用使用 Proguard 和 R8 的区别