用python的urllib抓取ASP.net的post的分页的问题和解决
友情帮朋友写一个小程序,需要自动抓取一个互联网网站的网页并进行分析。
选用python和其urllib,urllib2来搞这事情。 抓取第一页的数据很顺利,然而在抓取第2页等其他页的数据时却遇到了问题,虽然有返回数据,但返回的数据不是正常的第2页的页面,而是以下的出错提示:
53|error|500|Object reference not set to an instance of an object.|
在这问题上卡住了一两小时,用“Object reference not set to an instance of an object"做关键词去搜解决方案无果。后来看到有人提到:
”一般来讲 asp.net中的postback的分页都要提供 __EVENTTARGET、__EVENTARGUMENT、__VIEWSTATE这三个参数,前两个一般都是有规律的,后面这个就比较麻烦,每次的提交得到的都不同,所以要在每次提交分页前把当前页的__VIEWSTATE取到!“
然后有所启发,检查了一下我在程序里提交的post的参数,发现其中没有__VIEWSTATE,但是我提交的post的参数是在firefox里用firebug监控时copy过来的,按理不应有遗漏?!
再细查,在网页里是有
<inputtype="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="Bn/4+NZh/pRpuKJs+mDE6k9r3Lc1DIxEU7bhPlEDi5Gn3oW......
这一段, 有__VIEWSTATE 数据的呀。 再回去检查Firebug, 发现,原来虽然Firebug的Post -> ”参数“ 下面是没有__VIEWSTATE, 但是Firebug下方的Post -> "源代码” 那里则是有的:
......&__EVENTTARGET=&__EVENTARGUMENT
=&__LASTFOCUS=&__VIEWSTATE=H5AMBVqaLZCXd...
于是在python程序里补上__VIEWSTATE这个参数的值, 经检验问题解决!!
所以这个问题的起因是Firefox的firebug里的post参数没有显示__VIESTATE, 这个firebug插件的bug也许是因为__VIESTATE的值太长了?