快疯掉了,httpwebrequest的keepalive问题

hiall0526 2015-11-12 05:45:08
原来用vba在excel环境下采集网页数据,但随着采集页面的增加,想使用多线程来解决问题,于是开始vb.net入门。
在vba环境下使用WinHttp.WinHttpRequest.5.1,get和post配合采集数据倒也正常。

来到vb.net后,第一步get方式没有问题(带cookie访问)
到第二页数据需要使用post发送,无论如何和都不能得到正确的返回结果。

经过对程序提交数据和浏览器提交数据的比较分析

发现keepalive存在不一致,浏览器提交的头文件中有connection:keep-alive
但程序提交就没有。
网上查询说httpwebrequest默认keepalive为true,但是我设置为true时是没有这个内容的,设置为false则会增加connection:close

怎么办啊……救命!
...全文
1619 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
TIEDPAG 2018-06-27
  • 打赏
  • 举报
回复
因为默认使用的HttpWebRequest是1.1版本,keepalive=true的时候默认不加,如果把HttpWebRequest版本改为1.0即可

request.ProtocolVersion = new Version("1.0");
request.KeepAlive = true;
AhChi 2017-06-12
  • 打赏
  • 举报
回复
http1.1 默认就是keepalive,除非加上connection:close。浏览器是为了兼容历史1.0才额外的加上keepalive
hiall0526 2015-11-13
  • 打赏
  • 举报
回复
Dim WinhttpObject = CreateObject("WinHttp.WinHttpRequest.5.1") WinhttpObject.Open("POST", strUrl, False) WinhttpObject.setRequestHeader("Referer", strUrl) WinhttpObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") WinhttpObject.setRequestHeader("Content-Length", Len(Postdata)) WinhttpObject.setRequestHeader("Cookie", cookiew) WinhttpObject.setRequestHeader("Connection", "Keep-Alive") WinhttpObject.send(Postdata) 这是由vba代码改过来的,但是提交后与在vba中存在不同的就是缺少 connection:keep_alive myHttpWebRequest1.Method = "POST" myHttpWebRequest1.ServicePoint.Expect100Continue = False myHttpWebRequest1.KeepAlive = True myHttpWebRequest1.Referer = strUrl myHttpWebRequest1.ContentType = "application/x-www-form-urlencoded" myHttpWebRequest1.CookieContainer = mycookcontainer myHttpWebRequest.Timeout = 10000 Dim encoding As New ASCIIEncoding() Dim postByte As Byte() = encoding.GetBytes(Postdata) myHttpWebRequest1.ContentLength = postByte.Length Dim newStream As Stream = myHttpWebRequest1.GetRequestStream() newStream.Write(postByte, 0, postByte.Length) newStream.Flush() newStream.Close() Dim myHttpWebResponse1 As HttpWebResponse = CType(myHttpWebRequest1.GetResponse(), HttpWebResponse) reader = New StreamReader(myHttpWebResponse1.GetResponseStream, System.Text.Encoding.GetEncoding("utf-8")) Html = Replace(Replace(reader.ReadToEnd(), " ", ""), vbCrLf, "") 这是vb.net中的httpwebrequest 提交结果与winhttp方法一样。
hiall0526 2015-11-13
  • 打赏
  • 举报
回复
在vba的winhttp方法提交的时候,是有connection:keep_alive的 就可以正常抓取数据
hiall0526 2015-11-13
  • 打赏
  • 举报
回复
确认带上了cookie,通过fiddler抓包确认过。 add防范对于connection:keep-alive会报错
xdashewan 2015-11-13
  • 打赏
  • 举报
回复
你试下手动Headers.Add connection:keep-alive,不过说实话keep-alive和close的区别仅仅在于请求结束后是否关闭连接上,keep-alive的话下次请求会继续使用那个连接,close也会重新进行3次握手获得新的连接,理论上不存在问题,我倒是注意到你get带cookie,那你post的时候有没带上cookie呢
hiall0526 2015-11-13
  • 打赏
  • 举报
回复
在msdn发现了一句话: 此属性的值存储在 WebHeaderCollection 中。如果设置了 WebHeaderCollection,则该属性值将丢失。 我又把Headers.Add全部去掉了,还是不行。 httpwebresquest的Connection值还是为nothing 但KeepAlive值为True
这个一个俄国牛人写的开源工具,为啥说他强悍了,因为他将所有Http协议的底层都实现了一遍,这有啥好处?只要你是写爬虫的,都会遇到一个让人抓狂的问题,就是明明知道自己Http请求头跟浏览器一模一样了,为啥还会获取不到自己想要的数据。这时你如果使用HttpWebReaquest,你只能调试到GetRespone,底层的字节流是调试不到了。所以必须得有个更深入的底层组件,方便自己调试。以下是xNet的开源地址:https://github.com/X-rus/xNet  速入门。      首先来一个读取cnblogs首页的案例,HttpWebRequest在上一篇已经举例,我们看看xNet是怎么写的using (var request = new xNet.HttpRequest()){    var html = request.Get("http://www.cnblogs.com").ToString();}注意,默认的http头,建议用属性进行设置,譬如KeepAlive,Referer和UserAgent  扩展的Http头,譬如Upgrade-Insecure-Requests,可以使用AddHeader方法进行设置譬如using (var request = new xNet.HttpRequest()){    request.AddHeader("Upgrade-Insecure-Requests", "1");    var html=request.Get("http://www.cnblogs.com").ToString();}当然有些方法使用AddHeader和设置属性值是一样的,例如:      request.AddHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0");      request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0";      request.UserAgent = xNet.Http.FirefoxUserAgent();  当然不是所有值都可以使用AddHeader进行设置,譬如:Content-Type,这是POST时说明POST的数据类型,如果使用AddHeader会报错。如果你不知道那些可以手动设那些是不能的,参考xNet.HttpHeader的枚举值public enum HttpHeader{    Accept = 0,    AcceptCharset = 1,    AcceptLanguage = 2,    AcceptDatetime = 3,    CacheControl = 4,    ContentType = 5,    Date = 6,    Expect = 7,    From = 8,    IfMatch = 9,    IfModifiedSince = 10,    IfNoneMatch = 11,    IfRange = 12,    IfUnmodifiedSince = 13,    MaxForwards = 14,    Pragma = 15,    Range = 16,    Referer = 17,    Upgrade = 18,    UserAgent = 19,    Via = 20,    Warning = 21,    DNT = 22,    AccessControlAllowOrigin = 23,    AcceptRanges = 24,    Age = 25,    Allow = 26,    ContentEncoding = 27,    ContentLanguage = 28,    ContentLength = 29,    ContentLocation = 30,    ContentMD5 = 31,    ContentDisposition = 32,    ContentRange = 33,    ETag = 34,    Expires = 35,    LastModified = 36,    Link = 37,    Location = 38,    P3P = 39,    Refresh = 40,    RetryAfter = 41,    Server = 42,    TransferEncoding = 43,}当然他还支持Socks4和Socks5,代理的好处不言而喻了  标签:.net爬虫

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧