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

2023-10-28 05:10

本文主要是介绍利用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/");@Overridepublic void process(Page page) {page.putField("aboutme", page.getHtml().xpath("//textarea[@id='aboutme']/text()").toString());}@Overridepublic 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/");@Overridepublic void process(Page page) {page.putField("aboutme", page.getHtml().xpath("//textarea[@id='aboutme']/text()").toString());}@Overridepublic Site getSite() {return site;}}

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



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


这篇关于利用WebMagic的Cookie机制进行页面爬取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/290912

相关文章

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

JavaScript全屏,监听页面是否全屏

在JavaScript中,直接监听浏览器是否进入全屏模式并不直接支持,因为全屏API主要是关于请求和退出全屏模式的,而没有直接的监听器可以告知页面何时进入或退出全屏模式。但是,你可以通过在你的代码中跟踪全屏状态的改变来模拟这个功能。 以下是一个基本的示例,展示了如何使用全屏API来请求全屏模式,并在请求成功或失败时更新一个状态变量: javascriptlet isInFullscreen =

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementui分页输入框回车与页面中@keyup.enter事件冲突解决

解决这个问题的思路只要判断事件源是哪个就好。el分页的回车触发事件是在按下时,抬起并不会再触发。而keyup.enter事件是在抬起时触发。 so,找不到分页的回车事件那就拿keyup.enter事件搞事情。只要判断这个抬起事件的$event中的锚点样式判断不等于分页特有的样式就可以了 @keyup.enter="allKeyup($event)" //页面上的//js中allKeyup(e

vue子路由回退后刷新页面方式

最近碰到一个小问题,页面中含有 <transition name="router-slid" mode="out-in"><router-view></router-view></transition> 作为子页面加载显示的地方。但是一般正常子路由通过 this.$router.go(-1) 返回到上一层原先的页面中。通过路由历史返回方式原本父页面想更新数据在created 跟mounted

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

Spring中事务的传播机制

一、前言 首先事务传播机制解决了什么问题 Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY; 不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和