使用Google App Engine进行网页/屏幕抓取 - 代码在Python解释器中正常,但在GAE中无效

3 投票
1 回答
1728 浏览
提问于 2025-04-15 14:03

我想用谷歌应用引擎(GAE)来做一些网页抓取,具体是无限校园学生信息门户。这个服务需要你先登录才能进入网站。

我之前有一些代码在普通的Python环境下用mechanize库可以正常工作。但是当我发现不能在谷歌应用引擎中使用mechanize后,我就改用了urllib2和ClientForm。可是我一直无法登录到服务器,经过几个小时的折腾处理cookie后,我在普通的Python解释器中运行了同样的代码,结果却成功了。我查看了日志文件,发现里面有很多关于请求中去掉'host'头的信息……我在Google Code上找到了源文件,发现'host'头被列在一个“不可信”的列表中,所以在用户代码的请求中被删除了。

显然,GAE会去掉'host'头,而这个'host'头是无限校园用来判断你要登录哪个学校系统的,这就是我无法登录的原因。

那我该怎么解决这个问题呢?我在提交给目标网站的伪造表单中无法指定其他任何内容。为什么这会被认为是一个“安全漏洞”呢?

1 个回答

2

App Engine不会去“去掉”请求中的Host头信息,而是会强制这个信息根据你请求的URI(统一资源标识符)来准确设置。简单来说,如果URI是绝对的,服务器根本不允许考虑Host头的信息,按照RFC2616的规定:

  1. 如果请求的URI是绝对URI,那么主机信息就是请求URI的一部分。请求中的任何Host头信息都必须被忽略。

所以我觉得你可能误解了问题的原因。你可以试着把请求发送到一个你自己控制的“虚拟”服务器(比如你自己另一个简单的App Engine应用),这样你就可以查看从你的GAE应用发出的请求的所有头信息和内容,和从“正常的Python解释器”发出的请求进行对比。这样你观察到什么呢?

撰写回答