作者:mr.sun | 来源:互联网 | 2023-08-25 12:25
首先,代理我是测试了正常访问的(因为是收费代理,不存在代理失效的情况)我抓取是分2步,第一步在页面抓取token信息,在进入第二步的url里。设置用了代理后,第一步能获取token的url
首先,代理我是测试了正常访问的(因为是收费代理,不存在代理失效的情况)
我抓取是分2步,第一步在页面抓取token信息,在进入第二步的url里。
设置用了代理后,第一步能获取token的url是正常访问数据了(说明代理是生效的),进入第二步就不行了,设置断点是302(StatusCode为Found)
再重申一下就是,下面的代码在不用代理的情况下,就是正常本地IP地址去执行,是正常能在第二步获得到我的内容的
我贴一下关键代码:
url3 = "http://app.stc.gov.cn:8092/book/front/welcome!jszBookNext.action?typePath=jszBookUI&code=ZJ13&driveInfo.bookerMobile=" + mobile + "&smsCode=&mobile=&driveInfo.businessType.id=4028828244914e4401455efaf3e433dc&driveInfo.name=" + name + "&driveInfo.idType.id=e4e48584399b293601399b60996b55e6&driveInfo.idNumber=" + idcard + "&driveInfo.mobile=" + mobile;
if (ipProxy2.Length != 0)
{
myProxy = new WebProxy(ipProxy[0], int.Parse(ipProxy[1]));
myProxy.BypassProxyOnLocal = false;
}
else
{
myProxy = null;
}
token = Common.WebString.GetHtml(ZcyWebRequest.PostData(url3, "", myProxy, COOKIEContainer), "name=\"token\" value=\"", "\"");
调用的PostData代码如下:
public static string PostData(string Url, string RequestPara, WebProxy webProxy, COOKIEContainer COOKIEContainer)
{
// 创建WebRequest调用对象
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
if (webProxy != null)
{
// 设置通过代理完成调用
request.Proxy = webProxy;
}
// 数据编码为键值对
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.COOKIEContainer = COOKIEContainer;
request.AllowAutoRedirect = false;
request.UseDefaultCredentials = true;
// 将调用数据转换为字节数组
byte[] buf = Encoding.GetEncoding("UTF-8").GetBytes(RequestPara);
// 设置HTTP头,提交的数据长度
request.ContentLength = buf.Length;
// 写入参数内容
Stream requestStream = request.GetRequestStream();
requestStream.Write(buf, 0, buf.Length);
requestStream.Flush();
// 调用返回内容
string ReturnVal = "";
// 发起调用操作
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
object code = response.StatusCode;
// 响应数据流
Stream stream = response.GetResponseStream();
// 以UTF-8编码转换为StreamReader
StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("UTF-8"));
// 读取至结束
ReturnVal = reader.ReadToEnd();
reader.Close();
response.Close();
return ReturnVal;
}
14 个解决方案
302 是临时重定向,你看看返回的头中 Location 字段的值是什么
从断点里看,出现了302,查看location 是首页网址
HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Set-COOKIE: JSESSIOnID=B7698D83D772C367A34A25D4A2A94E32; Path=/book/; HttpOnly
Location: http://www.stc.gov.cn/
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
Content-Length: 0
Date: Sat, 14 Apr 2018 11:33:02 GMT
Connection: close
HTTP/1.1 200 OK
Date: Sat, 14 Apr 2018 11:33:15 GMT
Content-Type: text/html
Content-Length: .....
先 302 设置认证信息,然后重定向到目标
显然你没有跟着跳,或是没有回传认证信息
还是不太懂您的意思,方便加个qq吗?我的是755414
套红的的是 session id,你并没有捕获
另外还有 REFERER 你传了吗
我传输就2步,获取token后,就传入提交的页面。那这个referer是不是传那个token的页面吗?
是传那个token的页面 域名
对于 HTTP_REFERER 有的网站检查,有的不检查,但设置了总没错,又备无患嘛
对于 COOKIE
你虽然有 request.COOKIEContainer = COOKIEContainer;
但 302 时设置的 COOKIE 是否会附加到 request.COOKIEContainer 中,需要确认一下
依次查看这三个队形的值
COOKIEContainer
request.COOKIEContainer
response.COOKIEs
由于对方使用了 Session
如果你没有传递 SessionId 的话,出现问题是正常的
当你检查到 response.StatusCode 是 302 的话
应读取 Location 表头的值重新发起查询
已解决...其实代码完全没问题.问题出现在代理问题...不能去调试..也许在调试过程中,因为某些原因,导致出现302...
索性我就不调试了,直接代码运行到底.就正常返回我需要的页面.
在线程里sleep一会,不然怕对方太快也响应不到导致出错..