【发布时间】: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