首页 > 解决方案 > POST 请求只有在通过 httr 感知之前在站点上执行时才有效

问题描述

我想从这个站点抓取数据: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)

标签: pythonrweb-scrapingrvesthttr

解决方案


所以,这不是我想给出的完整答案,但可能是 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 包于 2021-02-09 创建(v0.3.0)

根据 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 上的某个人可能会这样做?

我查看 一些背景信息,并列出了:

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


推荐阅读