利用WebMagic的Cookie机制进行页面爬取

目前发布的WebMagic的最新版本仍然不支持post请求模拟登陆来抓取页面,但是相信,在后续的版本中,肯定会支持这项功能。那么要抓取登陆后才能看到的页面怎么办?

一、用户自己发送post请求,将获取的cookie设置到Spider中

二、用户使用抓包工具将抓到的cookie设置到Spider中

本文只讨论第二种方式,第一种方式的抓取,博主会在后续的博客中实现


本文抓取慕课网登陆后的个人信息设置页面,此个人信息设置页面要登录成功之后才能访问。


1)登录慕课网时,用浏览器的开发者工具对浏览器进行抓包。

      获取cookie信息如下,将该cookie信息记下


2)分析抓取页面。

我们要抓取的页面如下。注意,这个页面是只有用户成功登录后才能访问的。为简单起见,这个demo只抓取此页面的个性签名信息,以表示爬虫可以成功对此页面进行抓取。



3)编写PageProcessor

public class MoocProcessor implements PageProcessor {
	private Site site = new Site().setRetryTimes(3).setSleepTime(100)
			//添加cookie之前一定要先设置主机地址,否则cookie信息不生效
			.setDomain("www.imooc.com")
			//添加抓包获取的cookie信息
			.addCookie("Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968", "1466776143")
			.addCookie("Hm_lvt_f0cfcccd7b1393990c78efdeebff3968", "1466755724,1466775709")
			.addCookie("PHPSESSID", "c3i1dfva2mu4hc22m3m1pg65k0")
			.addCookie("apsid",
					"ExYjQ0ODhjN2IyNmY3ZTBlNWZhNDJhNTllNmQ1MmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTM1MDUzOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTU0NjIyMjZAcXEuY29tAAAAAAAAAAAAAAAAAAAAAGE2NDI5ZDM5OTgyN2I3MDY1MTNjNGU4ZWY2NWNkNjgxXTptV106bVc%3DND")
			.addCookie("cvde", "576d389dcceca-14").addCookie("imooc_isnew", "1")
			.addCookie("imooc_isnew_ct", "1466755723").addCookie("imooc_uuid", "49b7a51b-8451-4fb3-bcc8-9c27409519bf")
			.addCookie("last_login_username", "此处为用户名").addCookie("loginstate", "1")
			//添加请求头,有些网站会根据请求头判断该请求是由浏览器发起还是由爬虫发起的
			.addHeader("User-Agent",
					"ozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.516.400 QQBrowser/9.4.8188.400")
			.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
			.addHeader("Accept-Encoding", "gzip, deflate, sdch").addHeader("Accept-Language", "zh-CN,zh;q=0.8")
			.addHeader("Connection", "keep-alive").addHeader("Referer", "http://www.imooc.com/");

	@Override
	public void process(Page page) {
		page.putField("aboutme", page.getHtml().xpath("//textarea[@id='aboutme']/text()").toString());
	}

	@Override
	public Site getSite() {
		return site;
	}

}

4)编写测试用例

public class Test {
	public static void main(String[] args) {
		Spider.create(new MoocProcessor())
				// 从"http://www.imooc.com/user/setprofile"开始抓
				.addUrl("http://www.imooc.com/user/setprofile").addPipeline(new ConsolePipeline())
				// 开启5个线程抓取
				.thread(1)
				// 启动爬虫
				.run();
	}
}

5)测试结果


6)我们把添加cookie的代码去掉

public class MoocProcessor implements PageProcessor {
	private Site site = new Site().setRetryTimes(3).setSleepTime(100)
			//添加cookie之前一定要先设置主机地址,否则cookie信息不生效
			.setDomain("www.imooc.com")
			//添加抓包获取的cookie信息
//			.addCookie("Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968", "1466776143")
//			.addCookie("Hm_lvt_f0cfcccd7b1393990c78efdeebff3968", "1466755724,1466775709")
//			.addCookie("PHPSESSID", "c3i1dfva2mu4hc22m3m1pg65k0")
//			.addCookie("apsid",
//					"ExYjQ0ODhjN2IyNmY3ZTBlNWZhNDJhNTllNmQ1MmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTM1MDUzOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTU0NjIyMjZAcXEuY29tAAAAAAAAAAAAAAAAAAAAAGE2NDI5ZDM5OTgyN2I3MDY1MTNjNGU4ZWY2NWNkNjgxXTptV106bVc%3DND")
//			.addCookie("cvde", "576d389dcceca-14").addCookie("imooc_isnew", "1")
//			.addCookie("imooc_isnew_ct", "1466755723").addCookie("imooc_uuid", "49b7a51b-8451-4fb3-bcc8-9c27409519bf")
//			.addCookie("last_login_username", "995462226%40qq.com").addCookie("loginstate", "1")
			//添加请求头,有些网站会根据请求头判断该请求是由浏览器发起还是由爬虫发起的
			.addHeader("User-Agent",
					"ozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.516.400 QQBrowser/9.4.8188.400")
			.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
			.addHeader("Accept-Encoding", "gzip, deflate, sdch").addHeader("Accept-Language", "zh-CN,zh;q=0.8")
			.addHeader("Connection", "keep-alive").addHeader("Referer", "http://www.imooc.com/");

	@Override
	public void process(Page page) {
		page.putField("aboutme", page.getHtml().xpath("//textarea[@id='aboutme']/text()").toString());
	}

	@Override
	public Site getSite() {
		return site;
	}

}

7)去掉cookie之后的测试结果,抓取到的信息为空



5)和7)证明此网页只有登录后才能访问,需要添加cookie后爬虫才可以对该网页进行爬取



版权声明:本文为kingsonyoung原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。