【问题标题】:Web scraping remax.com for python网页抓取 remax.com for python
【发布时间】:2019-07-20 12:24:51
【问题描述】:

这类似于我遇到的问题here。答案很完美。既然我有一些事情要做,我现在要做的是,而不是手动输入一个 url 来获取数据。我想开发一个只接收地址和邮政编码并返回我想要的数据的函数。

现在的问题是修改 url 以获得正确的 url。例如

url = 'https://www.remax.com/realestatehomesforsale/25-montage-way-laguna-beach-ca-92651-gid100012499996.html'

我看到除了地址、州和邮政编码之外,后面还有一个数字,即 gid100012499996,它似乎对每个地址都是唯一的。所以我不确定如何才能实现我想要的功能。

这是我的代码:

import urllib
from bs4 import BeautifulSoup
import pandas as pd

def get_data(url):
    hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
            'Accept-Encoding': 'none',
            'Accept-Language': 'en-US,en;q=0.8',
            'Connection': 'keep-alive'}
    request = urllib.request.Request(url, headers=hdr)
    html = urllib.request.urlopen(request).read()

    soup = BeautifulSoup(html,'html.parser')
    foot = soup.find('span', class_="listing-detail-sqft-val")
    print(foot.text.strip())

url = 'https://www.remax.com/realestatehomesforsale/25-montage-way-laguna-beach-ca-92651-gid100012499996.html'
get_data(url)

我想要的是与上面类似的东西,但 get_data() 将接受地址、状态和邮政编码。如果这不是本网站的合适问题,我深表歉意。

【问题讨论】:

  • 所以您正在寻找一种方法来为给定地址生成gid
  • @smac89 那肯定有帮助,是的。
  • @smac89 你知道该怎么做吗?
  • 我的意思是,您无法自己获取该 gid,因为它似乎是为每个列表自动生成的。因此,您需要做的是找到一个 api,您可以通过某种方式对其进行操作以获得您想要的实际列表。我向您展示了该页面上的一个表单使用的示例 API,因此您可以进一步探索。这是我能够从其中一个 api 中提取的数据示例:codebeautify.org/jsonviewer/cb864e37,这是产生该数据的 curl 命令:pastebin.com/MbqqEn9x
  • 为这个问题提供一个实际的解决方案需要一些挖掘,我现在没有时间。打开您的 chrome 调试器并开始检查页面上的 API 调用,直到找到执行此操作的正确 api。您也可以只接受我发布的 curl 请求并将其切成可管理的部分,以便您可以使用它发出多个请求。 HTH。这就是我现在所能做的。不幸的是,网络抓取的危险之一是您必须深入挖掘才能找到解决方案的正确途径。 API 是一种可能的途径,但 HTML 可能有另一个故事要讲

标签: python web-scraping beautifulsoup urllib


【解决方案1】:

该网站有一个 JSON API,可让您获取给定矩形中属性的所有详细信息。矩形由 NW 和 SE 角的纬度和经度坐标给出。以下请求显示了可能的搜索:

import requests

params = {
    "nwlat" : 41.841966864112,          # Calculate from address
    "nwlong" : -74.08774571289064,      # Calculate from address
    "selat" : 41.64189784194883,        # Calculate from address
    "selong" : -73.61430363525392,      # Calculate from address
    "Count" : 100,
    "pagenumber" : 1,
    "SiteID" : "68000000",
    "pageCount" : "10",
    "tab" : "map",
    "sh" : "true",
    "forcelatlong" : "true",
    "maplistings" : "1",
    "maplistcards" : "0",
    "sv" : "true",
    "sortorder" : "newest",
    "view" : "forsale",
}

req_properties = requests.get("https://www.remax.com/api/listings", params=params)
matching_properties_json = req_properties.json()

for p in matching_properties_json[0]:
    print(f"{p['Address']:<40}  {p.get('BedRooms', 0)} beds | {int(p.get('BathRooms',0))} baths | {p['SqFt']} sqft")

这会产生 100 个响应(显然,更紧凑的矩形会减少结果)。例如:

3 Pond Ridge Road                         2 beds | 3.0 baths | 2532 sqft
84 Hudson Avenue                          3 beds | 1.0 baths | 1824 sqft
116 HUDSON POINTE DR                      2 beds | 3.0 baths | 2455 sqft
6 Falcon Drive                            4 beds | 3.0 baths | 1993 sqft
53 MAPLE                                  5 beds | 2.0 baths | 3511 sqft
4 WOODLAND CIR                            3 beds | 2.0 baths | 1859 sqft
.
.
.
95 S HAMILTON ST                          3 beds | 1.0 baths | 2576 sqft
40 S Manheim Boulevard                    2 beds | 2.0 baths | 1470 sqft

如果您有一个地址,那么您需要计算该地址的纬度和经度。然后在它周围创建一个小矩形作为 NW 和 SE 角。然后用这些数字构建一个 URL。然后,您将获得该地区所有属性(希望是 1 个)的列表。


要创建一个搜索方块,你可以使用类似的东西:

lat = 41.841966864112
long = -74.08774571289064
square_size = 0.001

params = {
    "nwlat" : lat + square_size,
    "nwlong" : long - square_size,
    "selat" : lat - square_size,
    "selong" : long + square_size,
    "Count" : 100,
    "pagenumber" : 1,
    "SiteID" : "68000000",
    "pageCount" : "10",
    "tab" : "map",
    "sh" : "true",
    "forcelatlong" : "true",
    "maplistings" : "1",
    "maplistcards" : "0",
    "sv" : "true",
    "sortorder" : "newest",
    "view" : "forsale",
}

square_size 需要根据您的地址准确程度进行调整。

【讨论】:

  • 好的,如果我有地址、纬度和经度等属性的列。我如何得到你得到的结果?
  • 我假设 se 是东南方?
  • 我会这么认为
  • 我尝试了你的方法,但我遇到了一些错误,你能看到这个stackoverflow.com/questions/55342568/…
  • 您在哪里找到 JSON API?
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2021-01-12
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
相关资源
最近更新 更多