【问题标题】:POST request works only if it is executed on the site before sensing through httrPOST 请求只有在通过 httr 感知之前在站点上执行时才有效
【发布时间】:2021-02-04 09:42:22
【问题描述】:

我想从这个站点抓取数据:https://ispu.mgipu.hr/ 这个想法是提取放大后可以看到的小点(它们的坐标)。

这是我想要自动化的过程(至少在缩放到 1:5000 之后):

  1. 您必须单击右侧具有正方形、三角形和圆形的符号。
  2. 然后您必须点击下方的“Info lokacija”。
  3. 那么您必须在“Odabir”上方选择“Poligonom”。
  4. 现在您必须用鼠标拖动任何东西并在完成后双击。

如果您在上述过程中检查网络,您会看到一个新的 XHR 请求出现:'obuhvat'。这是一个 POST 请求,它只有一个有效负载元素(带有坐标的 POLYGON)。

我尝试将这些 POST 请求直接发送到同一个站点,但我总是得到 400 响应。

只有在我首先在浏览器中执行所有操作并将相同的有效负载复制粘贴到请求时才有效。

这是我的尝试:

library(httr)


# params
url <- 'https://ispu.mgipu.hr/geo/api/info-lokacija/obuhvat'
ua <- 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'

# this works becuase I have already draw these polygon in app manually
data <- list(
  geom = "POLYGON((466131.6322632646 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851))"
)
req <- POST(url, body = data, encode = 'json', user_agent(ua))
print(req$status_code)

# this doesnt work, I have just change the one number in data
data <- list(
  geom = "POLYGON((466131.6322632647 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851))"
)
req <- POST(url, body = data, encode = 'json', user_agent(ua))
print(req$status_code)

【问题讨论】:

  • 我可以告诉你原因,但我还没有足够的解决方案
  • 迫不及待地想听听 :) 也许我没有在介绍帖子中解释。我的计划是去掉你在地图上看到的小点。我最感兴趣的是您可以使用右侧的“Prijava početka građenja, u...”过滤的点。我知道我可以通过在 URL https://ispu.mgipu.hr/geo/api/identify 上针对每个纬度/经度发送 POST 请求来废弃它们。但这是太多的要求。多边形“返回所有点”给定多边形。这是一个请求而不是数千个请求。但不知何故,当我构建自己的多边形时,它不起作用,只有当我首先在地图上绘制它时。
  • 我将在今天晚些时候发布答案。恐怕这不是一个完整的答案,因为由于它是一个不熟悉的领域,我还有很长的路要走。但我可以给你我认为的起点!
  • 太好了。非常感谢您花时间解决这个问题。

标签: python r web-scraping rvest httr


【解决方案1】:

所以,这不是我想给出的完整答案,但可能是 10 岁的首发。

回想起学校几何时,我记得涵盖了多边形的规则,并假设您更改坐标可能违反了规则。

以你给定的例子-

工作:

POLYGON((470883.3817753086 4925329.690667927,470757.9415158831 4925207.6103212265,470924.8218453713 4925156.090320726,470883.3817753086 4925329.690667927))

不工作:

POLYGON((466131.6322632647 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851)))

我决定通过一个可以检查至少一些多边形规则并给我返回比 http 代码更有意义的信息的包。

library(sf)
#> Warning: package 'sf' was built under R version 4.0.3
#> Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1

x = st_as_sfc("POLYGON((466131.6322632646 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851)))")
st_is_valid(x, reason = TRUE)
#> [1] "Valid Geometry"

# your altered
x = st_as_sfc("POLYGON((466131.6322632647 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851)))")
st_is_valid(x, reason = TRUE)
#> Error in CPL_geos_is_valid_reason(x): Evaluation error: IllegalArgumentException: Points of LinearRing do not form a closed linestring.

reprex package (v0.3.0) 于 2021-02-09 创建

根据 sf 包中应用的规则,我们现在获得了一些关于您的调整有效性的有用信息。

CPL_geos_is_valid_reason(x) 中的错误:评估错误:IllegalArgumentException:LinearRing 的点不形成闭合 线串。

谷歌搜索该错误导致我得到@yellowcap的答案:

有效的多边形或多多边形必须具有相同的起点和 端点。

有道理。您更改了起点,使其与终点不匹配,这意味着您没有封闭的多边形。

# start 466131.6322632647 5062601.925203851 
# end   466131.6322632646 5062601.925203851

通过更改一组不同的坐标进行测试(不是第一个|最后一个);保持开始和结束对相同并更改第二对

# 466141.4322828647 5062489.924979851  >> 566141.4322828647 6062489.924979851

x = st_as_sfc("POLYGON((466131.6322632647 5062601.925203851,566141.4322828647 6062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632647 5062601.925203851))")
st_is_valid(x, reason = TRUE)
# [1] "Valid Geometry"

但是,这并不能保证在您的 POST 中被接受。所以,我在想象我的 sf 应用程序没有处理的其他一些限制。我对 GIS 的了解还不够,无法解决这个问题,但也许 gis.stackexchange.com 上的某个人可能会这样做?

我看过this 对于一些背景,它列出了:

21.1。什么是有效性

有效性对于多边形来说是最重要的,它定义了有界区域并且需要大量的结构。线是 很简单,不能无效,积分也不能。

多边形有效性的一些规则感觉很明显,而另一些则感觉 任意的(事实上,是任意的)。

  1. 多边形环必须闭合。
  2. 定义孔的环应位于定义外部边界的环内。
  3. 环不能自相交(它们既不能相互接触也不能相互交叉)。
  4. 戒指不得接触其他戒指,除非在某个点。

所以,我想知道 sf 包是否提供了一个快速解决方案:

st_make_valid()

很遗憾,我无法解决您的失败案例。

然后我开始掉进一个大的 GIS 洞,几乎不知道我要去哪里。我开始查看QGIS,看看我是否可以编辑几何图形并进行更多工作,但没有走多远。


这是我的假设,有一些证据,关于下一步询问/看哪里的建议以及“目前失败但有兴趣所以会重新访问”的退出......


阅读:

  1. http://postgis.refractions.net/docs/ST_MakeValid.html

  2. https://docs.qgis.org/testing/en/docs/user_manual/working_with_vector/editing_geometry_attributes.html#vertex-tool

  3. https://r-spatial.github.io/sf/articles/sf5.html

  4. https://postgis.net/workshops/postgis-intro/validity.html

  5. https://www.rdocumentation.org/packages/lwgeom/versions/0.2-1/topics/valid

【讨论】:

  • 非常感谢您的解释!我现在明白了,为什么我的第二部分代码不起作用!现在我可以成功提出请求了。我还没有得到最终结果,但我已经很接近了。如果您在某个网站上有“给我买杯咖啡”选项,请告诉我:)
  • 我不知道如何联系到你,所以我写在这里。我有一个新的网络抓取问题(这里是stackoverflow.com/questions/66043028/…)。我将非常感谢您的帮助(在我看来,您是该领域的最佳人选之一)。我也想奖励你的工作,但不知道如何:)
  • 嗨,这链接到同一个问题。这是故意的吗?
  • 抱歉,链接错误。这是正确的:stackoverflow.com/questions/66866899/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多