【问题标题】:Missing some tag HTML while scraping using requests python on GCP VM在 GCP VM 上使用请求 python 抓取时缺少一些标记 HTML
【发布时间】:2021-04-10 09:13:36
【问题描述】:

我正在尝试抓取一个网站,如果我在自己的本地服务器上运行我的代码,结果符合预期,但如果我部署到 GCP 虚拟机,则缺少一些 HTML 标记。我已确保本地和 GCP 上的源代码相同。

有趣的是,如果我更改标题,我会得到更多丢失的标签。到目前为止,我发现这些标题效果最好:

headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/87.0.4280.141",
"Content-Type": "application/x-www-form-urlencoded",
"Connection": "keep-alive"}

缺少标签的问题是由发送的标头引起的,还是由 GCP VM 中发生的其他事情引起的?

【问题讨论】:

  • 我怀疑 GCP 是否会以某种方式过滤您的流量。这个问题没有很多信息可以做出可靠的假设,除非有人直接体验过。我的猜测是您正在查询的网站正在返回基于 IP 的不同结果(假设 GCP 上的代码和本地代码确实 100% 相同)。您能描述一下您是如何注意到“缺少 HTML 标记”的吗?听起来你在做len(bs4.find_ll("<div>")) 之类的 - 所以不确定你的意思。
  • 在本地和 GCP 上检查原始 HTML 是您最好的选择(查询后,将 HTML 转储到文件中)。当您从 GCloud 查询时,可能只是一条消息说“无法访问此网站”,这会给您一些更好的想法。
  • 我像这样在本地和 GCP 上打印出来,print(table.find_all("tr"))。本地输出:<tr><td>A</td></tr><tr><td>B</td></tr><tr><td>C</td></tr>。 GCP 输出:<tr><td>A</td></tr><tr><td>B</td></tr>。缺少 C,就像没有到末尾的截断 HTML 标记一样。
  • 在这种情况下,我的下一个最佳猜测是您正在运行 (a) 您的请求库或 (b) BeautifulSoup 的两个不同的版本。在 GCP 上并在本地运行 pip freeze | grep "beautifulsoup4\|requests"(将 requests 替换为您正在使用的任何请求库)并确保两个环境中的版本相同。如果您的应用程序使用requirements.txt 正确打包,请始终确保为每个依赖项添加最新的工作版本号 - 为您节省很多麻烦。
  • 很高兴为您提供帮助。 :)

标签: python google-cloud-platform request-headers python-requests-html


【解决方案1】:

回顾在 cmets 中完成的故障排除:

  • GCP 本身不会过滤标头。
  • 根据网站不同,抓取结果可能会因 IP 不同而有所差异。
  • 如果您在本地和 GCP 上进行的转储之间存在任何差异,请确保代码和所有依赖项都相同。

您可以找到更多关于从 GCP here 抓取的信息。

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多