HttpWebRequest获取BaiDu的网页

in Develop

前天发过这样一篇日志
http://yibin.us/zh-cn/item,485.aspx

运行后总是返回403错,这是远程主机强制关闭了连接
按照上文朋友样的评论,用WebRequest改成HttpWebRequest还是出现403
看来的确是BaiDu服务器终止了连接
抓包后发现,请求百度是在Header中有一段Cookie
是不是没有该cookie时baidu就会终止连接?
于是先请求一次news.baidu.com用工具获取它的cookie
在程序中加入该cookie,果然成功!而且未出现过错误
于是,修改了源代码:

request = (HttpWebRequest)WebRequest.Create(url);
#region start
HttpWebResponse response = null;
try
{
try
{
response = (HttpWebResponse)request.GetResponse(); //在这里可能出错,因为没有cookie
}
catch (WebException exp)
{
if (exp.Status == WebExceptionStatus.ProtocolError)
{
HttpWebRequest request_baidu = (HttpWebRequest)WebRequest.Create("http://news.baidu.com/"); //通过访问news.baidu.com获取一个cookie
using (HttpWebResponse response_baidu = (HttpWebResponse)request_baidu.GetResponse())
{
string str = response_baidu.Headers["Set-Cookie"];
baidu_cookie = str.Split(';')[0]; //得到cookie
request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.Cookie, baidu_cookie); //再次Create原始搜索地址,并加入cookie
response = (HttpWebResponse)request.GetResponse();
}
}
}
...................

当然
上面的代码的执行成功并不一定代表是cookie的问题
也许是其它我尚未查出的问题。

baidu挂了,测试也无法进行了~~~~~~~~~~

4 Comments

4 Comments

  1. 加一个User-Agent看看。应该可以的

  2. Re:TakWai
    曾试过把抓包抓来的所有http header信息加进来
    去掉cookie项后就失败
    加上cookie去掉其它的就行
    不过
    明天可以好好试一下
    毕竟这样获取cookie是很耗时的。

  3. 之前我读取Google News Rss时候,也出现过403的错误,后来检查了,才知道要加上User-Agent。

    噢…我刚才试了下Baidu News,没加User-Agent也正常,不过我是用ASP的XMLHTTP[em10] .Net不怎么会,呵呵

  4. Re:TakWai
    .Net中也可以用XMLHTTP,但一般不那样用
    都是用HttpWebRequest或是WebRequest类

Leave a Reply

Using Gravatars in the comments - get your own and be recognized!

XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>