此网页数据访问如何工作?

How this webpage data access works?

我正在尝试从此站点获取数据:[1] https://www.eurobet.it/it/scommesse/#!/calcio/?temporalFilter=TEMPORAL_FILTER_OGGI_DOMANI

我发现这个 link 我可以在其中获取 JSON 格式的数据:[2] https://www.eurobet.it/detail-service/sport-schedule/services/discipline/calcio?prematch=1&live=0&temporalFilter=TEMPORAL_FILTER_OGGI_DOMANI

但是有个问题: JSON link 并非每次都有效,实际上有时我会收到 404 错误。 我注意到,如果我在打开第二个 [2] 之前打开第一个 link [1],它会完美运行。

当我尝试在同一站点上抓取其他数据时,此错误也更频繁:[3] https://www.eurobet.it/detail-service/sport-schedule/services/discipline/calcio/piu-giocate/u-o-goal?prematch=1&live=0&temporalFilter=TEMPORAL_FILTER_OGGI_DOMANI

在这个 link [3] 中,我试图获得所有“u-o-goal”赔率,但是这个 link 仅当(在开始我的程序来抓取数据之前)在主 link [1] 我按下“U/O 目标”按钮 -> https://i.stack.imgur.com/Nei5u.png

在我的代码中,我使用 Java 和 htmlunit 来抓取数据。

我的问题是:这个网页是怎么工作的,为什么我不能直接打开links [2]/[3],我知道后面有一种请求和批准系统但是我看不到哪里。

您不能直接打开这些 URL,因为该网站(以及许多类似网站)将使用 cookie 和 bot-prevention techniques/session 跟踪,以便他们可以收集有关其网站使用情况的数据.例如。他们设置了一个“推荐人”。

我不会为你编写解决方案,但我至少可以帮助你了解你需要做什么才能到达你想要的地方...

我试图总结我通常如何取消选择这样的请求来重新创建它,但从本质上讲,您需要了解发出的 HTTP 请求的顺序(这就是网络的工作方式 - HTTP请求)。

  1. 首先,您通常从没有 session cookie 开始,然后直接访问网站(没有引荐来源网址)。
  2. 一旦您访问网站,服务器通常会响应一个 session cookie,以便您向服务器返回一个唯一的 session ID,这样它就有您的浏览器的某种记录已经联系了
  3. 您的浏览器可能会发出更多请求(异步),这样做通常会发送 cookie 和引用 URL(通常基础 Url 会起作用...只是不要使用某些东西以“https://www.eurobet.it”
  4. 以外的内容开头
  5. 您还需要解决其他问题。许多 header 是可选的。许多查询参数都有默认值。

https://whosebug.com/a/64671815/7619034 - 这是我之前给出的答案,它回答了这类经常出现的问题。

因此,针对您的具体情况,进一步解释一下...

当您访问 https://www.eurobet.it/it/scommesse/#!/calcio/?temporalFilter=TEMPORAL_FILTER_OGGI_DOMANI 时,服务器响应 HTTP headers:

...
set-cookie: __cfduid=dd38d***********41125; ...
...

其余的看起来不太相关:

直接转到另一个请求:https://www.eurobet.it/detail-service/sport-schedule/services/discipline/calcio?prematch=1&live=0&temporalFilter=TEMPORAL_FILTER_OGGI_DOMANI

此 HTTP 请求采用(作为输入):

cookie: __cfduid=dd38d***********41125; mbox=session#6661556c.....b6e8cc1fa6f03#1608242987; at_check=true; s_ecid=MCMID%***********2021453010; AMCVS_45F10C3A53DAEC9F0A490D4D%40AdobeOrg=1; AMCV_45F10C3A53DAEC9F0A490D4D%40AdobeOrg=1075005958%7CMCIDTS%7C18614%7CMCMID%7C91883906030825914429183258312021453010%7CMCAID%7CNONE%7CMCOPTOUT-1608248327s%7CNONE%7CvVersion%7C4.4.1; s_cc=true
...
referer: https://www.eurobet.it/it/scommesse/
...
x-eb-accept-language: it_IT
x-eb-marketid: 5
x-eb-platformid: 1

Cookie 在初始请求(通常)中使用 Set-Cookie header 设置,然后在后续请求中使用 cookie header 传回服务器。

我不确定这些值中有多少是相关的,但您需要弄清楚每个值在初始值和当前值之间的 HTTP 请求链中来自何处,并且您需要复制它们(请参阅我之前回答的上方 url - 警告这可能很耗时)。

其他 header 很可能可以静态设置,因为它们可能不会因更改而改变。

如果您可以在命令行上访问 curl,您可以尝试手动重建其中一些请求。有些对时间敏感,因为 cookie 会在一段时间后过期(请参阅 set-cookie header 详细信息以了解具体时间)。一旦您重建了一个工作请求,您就可以开始在您的应用程序中对其进行编码。

如果您能解决所有这些问题,您应该能够re-construct HTTP GET 请求链来获取您想要的JSON 数据。祝你好运!