最近因为工作需要,写一个爬虫小软件。
一切基本就绪后突然在爬一个ASP.NET站点时出问题了,错误信息如下:
505|error|500|Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.|
实现思路:
1、首先get请求到需要下载的页面,得到所有国家下拉options。
2、然后获取下一次post是需要的内容,例如:viewstate、eventvalidation等,
3、循环遍历第一步中获取到的所有国家,并且每次都要获取viewstate、eventvalidation等信息,然后post
问题回顾:
需要爬取一个站点的级联下拉框,比如:国家——〉省州,国家下拉onchange的时候,会回发从而改变省州内容,我的目的是爬出所有的国家以及国家对应的所有省州,为此我自己利用相同技术写了一个简单的站点,然后利用爬虫去爬取是ok了,如下图:
分析:
当我利用浏览器post的时候,我利用fiddler获取到 request header、form data内容,然后在程序中一个个写进去,并且fiddler监视到程序请求时 request header、form data 内容一样,所以我搞不明白问题出在哪儿??请大伙指点下!!
疑惑:
1、如果一个正常的网站(假设js不操作cookie的时候),我在代码中 new CookieContainer() 的时候,是否和浏览器访问网站是得到的cookie完全一样???我利用浏览器访问自己写的那个被爬取的站点得到的cookie和我利用代码请求时 new CookieContainer()得到的内容是一样的——只有一个ASP.NET_SessionId。
2、如果js操作了cookie是否会引发错误“Invalid postback or callback argument.”???
我用浏览器正常访问站点的时候cookie数量比我代码请求站点时要多好几个,(猜测)说明js应该是操作cookie了的???
ViewState记录了当前页面中的控件状态,所以你选了下拉框之后ViewState就会变更,为了不处理这玩意儿,我都是直接用 WebBrowser 控件来处理的。
考虑到 viewstate 元素的原因,但是我自己写的了一个asp.net测试网站,利用程序也爬取到了,说明思路应该没问题。
只是我不知道为什么我
new CookieContainer()
和浏览器访问站点得到的 session 个数不同,是js操作的???会对回发有影响???
不太明白WebBrowser的好处,我去查一下。
谢谢!!!
页面有隐藏的表单控件。
这么网站估计也不咋地(阿里就比较难办,看似一个请求实际n多请求,不好分析),你跟踪一遍所有请求对比或者直接抄袭请求就行了。
我想知道 cookie 不同会不会报这种错误。
1、第一次get请求一个页面
2、第二次post第一次等到viewstate等等;
我分别用程序和浏览器做这两次请求,然后用fiddler抓包,分析等处结果是两次post的form data基本差不多,viewstate有一点点区别(应该和时间有问题),请求header几乎一致,初次之外只剩下cookie有比较大的不同——浏览器请求的cookie要多好几个,因该是js写进去的。
现在我觉得ASP.NET web from 站点非常安全,至少应对爬虫来说,要爬它的数据,必须每次请求和上一次请求有太多关联了!!!