我正在尝试使用python浏览其着陆页上具有身份验证表单的网站,由ASP脚本呈现。
但是当我使用python(使用mechanize,requests或urlibs)来获取该站点的HTML时,由于这样的ASP脚本,我总是得到一个半空白的HTML文件。
有谁知道我可以使用任何方法来获得ASP网站的最终版本(如浏览器上显示的那样)?
答案 0 :(得分:2)
Your target page是frameset
。从我可以说服务器端没有什么花哨的东西。当我使用requests
或urllib
下载它时,即使根本不发送任何标题,我也会获得与Chrome或Firefox中看到的完全相同的HTML。有一些嵌入式JS,但它没有做任何事情。基本上,这里的所有内容都是frameset
,其中包含一个frame
。
frame
目标也是一个完全正常的页面,从我可以告诉的服务器端没有任何花哨的东西。同样,如果我在没有标题的情况下获取它,我会获得与Chrome或Firefox完全相同的内容。这里有很多嵌入式JS,但它不是从头开始构建DOM或任何东西;我从服务器获取的静态内容包含整个页面内容。我可以删除所有JS并渲染它,它看起来完全一样。
有一个小问题,服务器和HTML都没有在任何地方指定字符集,但内容不是ASCII,这意味着如果要将其作为Unicode处理,则需要猜测要解码的字符集。但如果您使用的是Python 2.x,并且只是计划通过ID或其他东西从DOM中获取内容,那就不重要了。
我怀疑你的真正问题只是你不知道HTML frameset
是如何工作的。您正在下载frameset
,而不是下载引用的frame
,并想知道为什么结果页面看起来像空frameset
。
框架是一个过时的功能,任何人都不会使用任何东西,除了一个常见的技巧,即使在古老的浏览器中让用户弹出一个新窗口,以及一些愚弄弹出窗口拦截器的模糊技巧。在HTML 5中,它们终于消失了。但只要古代网站在那里并且需要被删除,你就需要知道它们是如何工作的。
这不是完整文档的替代品,但这里是网络浏览器使用frameset
所做的简短版本:对于每个frame
标记,它都跟在src
之后属性,然后它将frame
标记的内容替换为没有属性的#document
标记,其结果是将src
URL作为其内容。当然,除此之外,帧会影响布局,但这可能不会影响你。
与此同时,如果你正在尝试学习网页抓取,你真的想安装浏览器的“Web开发者工具”(不同的浏览器有不同的名称),或者像Firebug这样的全功能调试器。这样,您可以检查浏览器正在呈现的实时树,并将其与您从脚本中获得的内容进行比较(或者更简单地,从wget
)。所以,下次你可以说“在Chrome浏览器检查页面中,我看到#document
下面有一个frame
,下面有一大堆东西,但当我尝试自己阅读同一页面时, frame
没有孩子“。