热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用HttpWebRequest抓取网页,不用代理就成功抓取到。一旦用了代理后就302(StatusCode为Found),请教

首先,代理我是测试了正常访问的(因为是收费代理,不存在代理失效的情况)我抓取是分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 个解决方案

#1


有这方面经验的小伙伴吗?困扰了好多天了

#2


302 是临时重定向,你看看返回的头中 Location 字段的值是什么

#3


从断点里看,出现了302,查看location 是首页网址

#4


 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 设置认证信息,然后重定向到目标
显然你没有跟着跳,或是没有回传认证信息

#5


还是不太懂您的意思,方便加个qq吗?我的是755414

#6


引用 4 楼 xuzuning 的回复:
 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 设置认证信息,然后重定向到目标
显然你没有跟着跳,或是没有回传认证信息



红色的是什么意思呢?COOKIEs我都带了进去了

#7


套红的的是 session id,你并没有捕获
另外还有 REFERER 你传了吗

#8


我传输就2步,获取token后,就传入提交的页面。那这个referer是不是传那个token的页面吗?

#9


是传那个token的页面 域名
对于 HTTP_REFERER 有的网站检查,有的不检查,但设置了总没错,又备无患嘛

对于 COOKIE
你虽然有 request.COOKIEContainer = COOKIEContainer;
但 302 时设置的 COOKIE 是否会附加到 request.COOKIEContainer 中,需要确认一下

#10


引用 9 楼 xuzuning 的回复:
是传那个token的页面 域名
对于 HTTP_REFERER 有的网站检查,有的不检查,但设置了总没错,又备无患嘛

对于 COOKIE
你虽然有 request.COOKIEContainer = COOKIEContainer;
但 302 时设置的 COOKIE 是否会附加到 request.COOKIEContainer 中,需要确认一下


从各种调试后,也是对COOKIEs导致的302的疑问大点,但现在还不太确认应该怎么去排查

#11


引用 9 楼 xuzuning 的回复:
是传那个token的页面 域名
对于 HTTP_REFERER 有的网站检查,有的不检查,但设置了总没错,又备无患嘛

对于 COOKIE
你虽然有 request.COOKIEContainer = COOKIEContainer;
但 302 时设置的 COOKIE 是否会附加到 request.COOKIEContainer 中,需要确认一下


另外COOKIEContainer是个全局变量...第一次赋予了,就没改变了

#12


依次查看这三个队形的值
COOKIEContainer
request.COOKIEContainer
response.COOKIEs
由于对方使用了 Session
如果你没有传递 SessionId 的话,出现问题是正常的
当你检查到 response.StatusCode 是 302 的话
应读取 Location 表头的值重新发起查询

#13


引用 12 楼 xuzuning 的回复:
依次查看这三个队形的值
COOKIEContainer
request.COOKIEContainer
response.COOKIEs
由于对方使用了 Session
如果你没有传递 SessionId 的话,出现问题是正常的
当你检查到 response.StatusCode 是 302 的话
应读取 Location 表头的值重新发起查询


http://www.fly-pig.com/TestBitCar.rar

我把我的这个拆分独立了一个新项目,麻烦版主同学,一起研究下.谢谢

#14


已解决...其实代码完全没问题.问题出现在代理问题...不能去调试..也许在调试过程中,因为某些原因,导致出现302...
索性我就不调试了,直接代码运行到底.就正常返回我需要的页面.
在线程里sleep一会,不然怕对方太快也响应不到导致出错..

推荐阅读
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 在HTML布局中,即使将 `top: 0%` 和 `left: 0%` 设置为元素的定位属性,浏览器中仍然会出现空白填充。这个问题通常与默认的浏览器样式、盒模型或父元素的定位方式有关。为了消除这些空白,可以考虑重置浏览器的默认样式,确保父元素的定位方式正确,并检查是否有其他CSS规则影响了元素的位置。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
author-avatar
mr.sun
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有