读书人

爬虫抓取亟需登陆才能被访问的页面

发布时间: 2012-11-15 15:16:14 作者: rapoo

爬虫抓取需要登陆才能被访问的页面

爬虫抓取需要登陆才能被访问的页面2009年09月03日 星期四 下午 11:471. 获取需要登陆才能被访问的页面,HttpClient(扩展HttpWebRequest)来实现使用HttpClient client = new HttpClient("[登陆页面地址]?username=aaa&password=bbb", null, true); //最后一个参数true,表示保存返回的Cookies,string html=client.GetString();//发出请求,返回结果字符串;client.url=searchurl; //searchurl为查询页面,在该url后连上对应的查询条件即可完成查询string html=client.GetString();然后可以通过正则表达式,根据指定的字符串模型返回需要的部分/// <summary>/// 在源字符串中查找前置字符串为left,后置字符串为right的内容/// </summary>/// <param name="source">源字符串</param>/// <param name="condition">条件字符串,由前置字符串+<%%>+后置字符串组成</param>/// <param name="right">后置字符串</param>/// <param name="index">要返回的结果集合中的子项</param>/// <returns></returns>public static string FindSubString(string source,string condition,int index){string regexString = condition.Replace("<%%>", @"([\s\S]*?)");Match m = null;m = Regex.Match(source, regexString);return  m.Groups[index].Value;}获取编码转换后的字符串HttpClient client=new HttpClient(url);string html=client.GetString();GetString()函数内部会查找Http Headers, 以及HTML的Meta标签,试图找出获取的内容的编码信息.如果都找不到,它会使用client.DefaultEncoding, 这个属性默认为utf-8, 也可以手动设置.自动保持Cookie, RefererHttpClient client=new HttpClient(url1, null, true);string html1=client.GetString();client.Url=url2;string html2=client.GetString();这里HttpClient的第三个参数,keepContext设置为真时,HttpClient会自动记录每次交互时服务器对Cookies进行 的操作,同时会以前一次请求的Url为Referer.在这个例子里,获取html2时,会把url1作为Referer, 同时会向服务器传递在获取html1时服务器设置的Cookies. 当然,你也可以在构造HttpClient时直接提供第一次请求要发出的Cookies与Referer:HttpClient client=new HttpClient(url, new WebContext(cookies, referer), true);或者,在使用过程中随时修改这些信息:client.Context.Cookies=cookies;client.Context.referer=referer;模拟HTML表单提交HttpClient client=new HttpClient(url);client.PostingData.Add(fieldName1, filedValue1);client.PostingData.Add(fieldName2, fieldValue2);string html=client.GetString();上面的代码相当于提交了一个有两个input的表单. 在PostingData非空,或者附加了要上传的文件时(请看下面的上传和文件), HttpClient会自动把HttpVerb改成POST, 并将相应的信息附加到Request上.向服务器上传文件HttpClient client=new HttpClient(url);client.AttachFile(fileName, fieldName);client.AttachFile(byteArray, fileName, fieldName);string html=client.GetString();这里面的fieldName相当于<input type="file" name="fieldName" />里的fieldName. fileName当然就是你想要上传的文件路径了. 你也可以直接提供一个byte[] 作为文件内容, 但即使如此,你也必须提供一个文件名,以满足HTTP规范的要求.不同的返回形式字符串: string html = client.GetString();流: Stream stream = client.GetStream();字节数组: byte[] data = client.GetBytes();保存到文件:  client.SaveAsFile(fileName);或者,你也可以直接操作HttpWebResponse: HttpWebResponse res = client.GetResponse();每调用一次上述任何一个方法,都会导致发出一个HTTP Request, 也就是说,你不能同时得到某个Response的两种返回形式.另外,调用后它们任意一个之后,你可以通过client.ResponseHeaders来获取服务器返回的HTTP头. 下载资源的指定部分(用于断点续传,多线程下载)HttpClient client=new HttpClient(url);//发出HEAD请求,获取资源长度int length=client.HeadContentLength();//只获取后一半内容client.StartPoint=length/2;byte[] data=client.GetBytes();HeadContentLength()只会发出HTTP HEAD请求.根据HTTP协议, HEAD与GET的作用等同, 但是,只返回HTTP头,而不返回资源主体内容. 也就是说,用这个方法,你没法获取一个需要通过POST才能得到的资源的长度,如果你确实有这样的需求,建议你可以通过GetResponse(),然后 从ResponseHeader里获取Content-Length.模拟登录2、session方式package com.crawinfo.httpclient;import java.io.IOException;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpException;import org.apache.commons.httpclient.NameValuePair;import org.apache.commons.httpclient.methods.GetMethod;import org.apache.commons.httpclient.methods.PostMethod;public class HttpClientTest {/*** @param args* @throws IOException * @throws HttpException */public static void main(String[] args) throws HttpException, IOException {HttpClient httpclient=new HttpClient();//创建一个客户端,类似打开一个浏览器 GetMethod getMethod=new GetMethod("受保护的地址");PostMethod postMethod = new PostMethod("登录url");   NameValuePair[] postData = new NameValuePair[2];   postData[0] = new NameValuePair("loginName", "***");   postData[1] = new NameValuePair("loginPswd", "**");   postMethod.addParameters(postData);   int statusCode=httpclient.executeMethod(postMethod);//回车——出拳!   statusCode= httpclient.executeMethod(getMethod);System.out.println("response1=" + postMethod.getResponseBodyAsString());//察看拳头命中情况,可以获得的东西还有很多,比如head, cookies等等   System.out.println("response2=" + getMethod.getResponseBodyAsString());//察看拳头命中情况,可以获得的东西还有很多,比如head, cookies等等   getMethod.releaseConnection();postMethod.releaseConnection();//释放,记得收拳哦  }}3、cookie方式package com.crawinfo.rencai;import org.apache.commons.httpclient.Cookie;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpMethod;import org.apache.commons.httpclient.methods.GetMethod;public class CrawTest {static Cookie[] cookies=new Cookie[2];public static void login() throws Exception {cookies[0] = new Cookie("抓取信息网址", "SessionId","0", "/", -1, false);cookies[1] = new Cookie("抓取信息网址", "otherproperty","xxx", "/", -1, false);}public static String getRes(String path)throws Exception{String res=null;HttpClient client=new HttpClient();HttpMethod method=new GetMethod(path);client.getState().addCookies(cookies);client.executeMethod(method);if(method.getStatusCode()==200){res=method.getResponseBodyAsString();cookies=client.getState().getCookies();}method.releaseConnection();return res;}public static void main(String[] args) throws Exception {CrawTest.login();String info = CrawTest.getRes("抓取信息网址");System.out.println("info="+info);}}
? 1 楼 wsdydmw 2012-05-29 并不是所有的登陆都是这样的 [登陆页面地址]?username=aaa&password=bbb
有些是靠的session

读书人网 >编程

热点推荐