`
endual
  • 浏览: 3566895 次
  • 性别: 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

相关推荐

    爬虫工具抓取注意事项

    由于Flash内容往往不易被抓取,因此在编写爬虫时需要注意以下几点: 1. **识别Flash对象**:通过分析网页源代码确定是否存在Flash元素。 2. **尝试替换为HTML5版本**:如果目标网站提供了替代方案,则优先使用更为...

    java网络爬虫模拟登入抓取数据

    在许多情况下,特别是涉及到登录后才能访问的内容,如人人网这样的社交平台,我们不能简单地通过HTTP请求获取数据,因为这些页面需要用户身份验证。这就需要用到模拟登录的技术。 模拟登录的核心在于复现用户在...

    爬虫模拟登录知乎1

    - 这种技术通常用于那些需要登录才能访问的网站或页面。 #### 二、知乎模拟登录案例 1. **登录URL**: - 本文介绍了一个知乎网站的模拟登录案例,登录的URL为 `http://www.zhihu.com/login/email`。 2. **POST...

    python实现网络爬虫使用了第三方库beautifulsoup来解析网页文件,并且实现了cookie登录特定网站访问.zip

    3. 使用携带cookie的GET请求访问需要登录才能查看的页面。 在这个过程中,可能还需要处理一些其他问题,比如登录验证、验证码识别、反爬虫策略等。对于这些问题,Python有许多库可以帮助解决,例如`pytesseract`...

    python爬虫项目——自动批量抓取m3u8网页视频

    在实际应用中,我们还需要考虑一些其他因素,比如错误处理、速率控制(防止过快的请求引起服务器封禁)、登录验证(如果视频资源需要登录后才能访问)、代理IP轮换(用于提高爬取效率和避免IP被封)以及反爬虫策略...

    带自动账密登录功能的爬虫设计

    在实际应用中,自动账密登录功能的爬虫可以应用在各种需要登录才能访问数据的场景,例如获取个人网银数据、爬取招聘网站的简历和职位信息、爬取个人邮箱内的信用卡账单等。这些场景下,自动登录功能是爬虫能否成功...

    网络爬虫新浪微博抓取

    此外,为了避免被网站封禁,爬虫需要设置合理的抓取频率和策略。可以使用User-Agent随机化、IP代理池等方法来模拟多个不同的用户,降低单一IP地址的访问频率,减少被检测为异常的风险。 在数据抓取完成后,数据清洗...

    爬虫(爬取登录后的数据).zip

    在许多情况下,有些网站的数据是需要用户登录后才能访问的,这就涉及到如何编写能够处理登录流程的爬虫。本教程将详细介绍如何使用Python编写爬虫来爬取登录后的数据。 首先,我们需要了解登录过程的基本步骤。通常...

    python爬虫使用cookie登录详解

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

    php爬虫--伪登录

    3. **伪登录**:在爬虫中,为了访问需要登录后才能看到的内容,我们需要模拟用户登录的过程,这就是所谓的伪登录。这包括以下几个步骤: - **收集登录表单信息**:首先,爬虫需要获取登录页面的HTML源代码,识别出...

    java爬虫模拟登陆源码

    Java爬虫模拟登陆是网络爬虫技术中一个重要的环节,特别是在需要登录后才能访问的数据抓取场景中。本文将深入探讨这一主题,介绍如何使用Java编写爬虫进行模拟登录,并获取登录后的网页数据。 首先,我们需要理解...

    爬虫+百度贴吧图片抓取案例+源码demo

    百度贴吧可能需要用户登录才能访问某些资源,这时我们可以利用requests库发送POST请求,携带登录所需的cookie和session信息。此外,百度可能会设置验证码、IP限制或User-Agent检测来防止爬虫,我们需要模拟浏览器...

    zhihu_scrapy_爬虫excel_知乎爬虫_scrapy扫码登录_

    `cookies.py`可能用于存储登录后的cookies,这是维持会话状态的关键,因为一旦登录成功,爬虫需要使用这些cookies来访问需要登录才能查看的页面。 在实际操作中,`zhihu.py`中的代码可能会包括以下步骤: 1. 导入...

    正方教务系统爬虫

    用户需要有一定的编程基础,特别是Python和网络爬虫的相关知识,才能理解和修改这个爬虫项目。 总的来说,"正方教务系统爬虫"是一个实用的工具,它利用编程技术自动化处理教务信息,为用户带来了便利。同时,这也...

    Python爬虫,京东自动登录,在线抢购商品.zip

    这对于实现京东的在线抢购至关重要,因为只有在保持登录状态下,我们才能访问到个人购物车和订单页面。 4. **模拟登录**:通过分析登录页面的POST请求,我们可以构造一个包含所有必要参数(包括账号、密码、验证码...

    Java爬虫Jsoup+httpclient获取动态生成的数据

    在Web开发和数据抓取领域,Java爬虫技术是实现网页自动化信息提取的重要手段。...但需要注意的是,爬取数据时应遵守网站的robots.txt协议以及相关法律法规,合理使用爬虫,避免对目标网站造成过大的访问压力。

    网站抓取(使用cookie)

    在网站抓取中,模拟这种Cookie交换机制可以帮助我们成功抓取需要登录才能访问的页面。 要实现网站抓取并使用Cookie,通常我们需要以下步骤: 1. **初始化请求**:首先,我们需要发送一个初始请求到目标网站,获取...

    PHP使用Curl实现模拟登录及抓取数据功能示例

    在PHP开发中,有时我们需要获取一些需要用户登录后才能访问的网页内容,此时可以借助Curl库来模拟登录过程并抓取数据。Curl库是一个强大的URL处理工具,支持多种协议,包括HTTP、HTTPS等,它能让我们在PHP中发送HTTP...

    php防恶意刷新,过度抓取页面脚本

    当用户或第三方程序恶意地频繁刷新页面或过度抓取内容时,这可能导致服务器资源耗尽,影响正常用户的访问,甚至可能暴露敏感信息。针对这种情况,PHP作为广泛应用的服务器端脚本语言,提供了多种策略来防止这种恶意...

    抓取评论爬虫python案例

    在“抓取评论爬虫”案例中,首先需要使用requests库发送GET请求到目标网页,获取网页源代码,然后才能进一步解析和提取评论。 【Scrapy框架】 对于更复杂、大规模的爬虫项目,Scrapy框架是一个高效的选择。它提供...

Global site tag (gtag.js) - Google Analytics