使用Python和urllib2抓取ASP.NET
我一直在尝试用Python和urllib/urllib2来抓取一个用微软技术栈(ASP.NET、C#、IIS)搭建的网站,但一直没有成功。我还在用cookielib来管理cookies。花了很长时间在Chrome上分析这个网站,查看请求头,但我还是没找到一个能成功登录的解决方案。目前,为了让它在最基本的层面上工作,我把编码后的URL字符串和所有必要的表单数据(甚至包括View State等)都硬编码了进去。我也传递了有效的请求头。
我现在收到的响应是:
29|pageRedirect||/?aspxerrorpath=/default.aspx|
我不太确定该如何理解上面的内容。此外,我也仔细查看了处理登录字段的客户端代码。
这是它的工作原理:你输入用户名和密码,然后点击“登录”按钮。按下回车键也会模拟这个按钮的点击。输入框并不在一个表单里,而是这个登录按钮上有几个onClick事件(大部分只是为了美观),但有一个是用来处理验证的。在发送到服务器之前,它会进行一些基本的检查。根据网络资源,它显然在使用.NET AJAX。
正常登录这个网站时,你会以POST的方式请求域名,并带上用户名和密码等表单数据。然后,会有某种URL重写或重定向,把你带到url.com/twitter的内容页面。当你直接访问url.com/twitter时,它会把你重定向到主页。
我应该提到的是,我决定不公开这个网址。我并没有做什么恶意的事情,只是想自动化一个非常单调的检查,每隔一段合理的时间就做一次(我对友好的屏幕抓取很熟悉)。不过,如果这让域名的拥有者不高兴,关联我的StackOverflow账号和那个账号是很简单的。
我的问题是: 我过去能够成功登录并自动化服务,但那些都不是基于.NET的。有没有什么不同的地方我应该注意,或者我可能遗漏了什么?
2 个回答
在抓取一个网页应用的时候,我通常会用以下两种工具:
1) WireShark ... 或者...
2) 一个记录代理服务器(它可以记录请求的头信息和内容)
然后,我会把真实应用的表现(比如,你的浏览器是如何和这个网站互动的)和抓取工具记录下来的信息进行对比。通过分析这些不同之处,你就能找到一个有效的解决方案。
对于将来可能遇到类似情况的其他人:
我想说的是,我在Chrome浏览器中使用Greasemonkey用户脚本进行数据抓取和自动化方面取得了很大的成功。我发现这比用Python和urllib2要简单得多(至少在这个特定的情况下是这样)。这些用户脚本完全是用JavaScript编写的。