一般的不需要登陆的网页抓取:(C#)
using System;
using System.IO;
using System.Net;
using System.Text;
namespace CSharpTest0 {
internal class Program {
private static void Main(string[] args) {
var request =
(HttpWebRequest) WebRequest.Create("http://www.somehost.com/resourcePath");
request.Method = "GET";
HttpWebResponse response = null;
StreamReader sr = null;
try {
response = (HttpWebResponse) request.GetResponse();
sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
//do something
}
catch (Exception ex) {
//do something
}
finally {
sr.Close();
response.Close();
}
}
}
}
然而需要登陆后,才能获取的授权网络资源的抓取,要费一些周折。
一般在传统的httpRequest请求基础上,在附加网站自定义的cookie。注意是网站自定义的cookie,可能会有若干个。
下面以baixing.com为例讲述抓取授权页面的过程。
首先,我们需要使用HttpAnalyzer来分析数据流。
HttpAnalyzer软件ready后,清空浏览器的历史记录和已保存的密码。
打开浏览器,IE或者chrome都可以。输入要访问的URI。打开httpAnalyzer,开启http数据流抓取功能。再按回车键。
之所以没有在打开浏览器前打开一般打开浏览器前打开httpAnalyzer。是因为浏览器在启动时会链接到我们设定好了的HomePage,干扰数据流的分析。
好了,现在如果前述动作执行正确的话,浏览器应该进入登陆界面了,而不是我们需要的URI。
接着输入用户名密码,进行登陆。完成以后,关闭浏览器,进入httpAnalyzer界面,停止http数据流抓取。
好了现在分析httpAnalyzer抓取到的数据流。
我想要的资源URI :http://www.baixing.com/a/b/c。
首先,浏览器发出一个普通的上述httprequest,response是的code是302 NOT FOUND。response的header里Set-Cookie:__trackId=123456789012345。共15位,这是很重要的cookie,接下来的httprequest都会有用到 。response其他的header字段不重要,暂时忽略。
接下来,浏览器使用了刚获取的__trackId再次发送了一个httprequest,URL是/oz/login?&redirect=?http://www.baixing.com/a/b/c。
cookie有两个,一个是__trackId,还有一个就是_auth_redirect=http%3A%2F%2Fwww.baixing.com%2Fa%2Fb%2Fc%2F%2F。
对应的reponse会返回个cookie名称是__uuid。
然后,再次发送httprequest,这次是获取登录界面URL是/oz/login?&redirect=?http://www.baixing.com/a/b/c。
httprequest的cookie变了,变成三个了,除了__trackId和_auth_redirect外,还有个——uuid。
response的cookie会有个token,这个是在POST数据时,和用户名密码一起发给server的,是会话的一个标记。
接着,你输入的用户名密码,额,POST个httprequest。POST Data有用户名和密码以及token。
POST网页后拿到的Response的cookie会有名为:__t,__u,__c,__n,嗯,到此,我们拿到了所有的cookie。
加上之前的__trackId和__uuid。就能抓取到授权网页了。
需要源代码的,留下邮箱索取。