`
endual
  • 浏览: 3508181 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多

爬虫抓取需要登陆才能被访问的页面
2009年09月03日 星期四 下午 11:47
1. 
获取需要登陆才能被访问的页面,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, Referer

HttpClient 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

相关推荐

    python爬虫使用cookie登录详解

    比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用Urllib库保存我们登录的Cookie,然后再抓取其他页面,这样就达到了我们的目的。 一、Urllib库简介 Urllib...

    人人网爬虫文件

    人人网资源爬取,Http协议是一个无... 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的,那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了

    网络爬虫Spider

     目前,专业搜索引擎网络爬虫通常采用“最好优先”原则访问WEB,即为快速、有效地获得更多的与主题相关的页面(简称“回报”),每次选择“最有价值”的链接进行访问。由于链接包含于页面之中,而通常具有较高价值...

    玩转python爬虫之cookie使用方法

    比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了。 在此之前呢,我们必须先介绍一个...

    Python爬虫之模拟知乎登录的方法教程

    对于经常写爬虫的大家都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 “登录” 离不开 HTTP 中的 Cookie 技术。 登录原理 Cookie 的原理非常简单,因为 HTTP 是一种无...

    豆瓣网页数据抓取与页面分析和展示

    豆瓣电影列表抓取,页面分析和展示,适用于python初学着想体验数据爬取,存储,展示等系列代码,本代码使用环境为python3.9+vscode。 一、代码总体分为三部分1、save_movie.py:抓取url存取url;2、read_movie.py:...

    一个简单的java爬虫产品

    最近一直在研究爬虫和Lucene,虽然开始决定选用Heritrix来执行爬虫操作,但是后来发现用它来做还是存在一定的问题,比如需要程序生成相应的XML文件,对于同一个Job,怎样才能保证重复运行该Job时文件夹始终是同一个...

    基于python的新闻爬虫

    咱们的目标是抓取页面上的新闻链接,这些链接被放在了一系列的ul和li标签里。所以,咱得一个个ul去看,每个ul里面又是一堆li,每个li里面才是咱们要的新闻链接。 找到链接后,咱再次用requests去访问这个链接,把...

    利用python爬虫(part15)–cookie模拟登陆

    有的时候,我们想要抓取一个网站,但是需要先登录才能访问它,如果不输入用户名和密码,我们就会一直停留在登录页面。 那我们该如何抓取呢? 这时,我们可以用cookie模拟登录。 获取cookie 我们以猫耳FM为例,咳咳...

    详解在Python程序中使用Cookie的教程

    比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了。 在此之前呢,我们必须先介绍一个...

    Apple-Store-Crawler:一个简单、可扩展的应用程序数据抓取器,用于在 Apple AppStore 上列出

    您所要做的就是将 SharedLibrary 上的配置文件和“Consts”类更改为您自己偏好的值(队列名称、MongoDB 凭据/地址)和 Amazon Web Services 密钥(您需要这些值才能访问您的队列从代码)。 有关更多详细信息,请...

Global site tag (gtag.js) - Google Analytics