Scrapy 模拟登录知乎--抓取热点话题

工具准备

在开始以前,请确保 scrpay 正确安装,手头有一款简洁而强大的浏览器, 如果你有使用 postman 那就更好了。css

使用以上命令生成知乎爬虫,代码以下:html

有一点切记,不要忘了启用 Cookies切记切记 :git

 

模拟登录

过程以下:github

  • 进入登陆页,获取 Header 和 Cookie 信息

完善的 Header 信息能尽可能假装爬虫, 有效 Cookie 信息能迷惑知乎服务端,使其认为当前登陆非首次登陆,若无有效 Cookie 会遭遇验证码。 在抓取数据以前,请在浏览器中登陆过知乎,这样才使得 Cookie 是有效的。json

3255415-6c02f08c8697ef0c

Header 和 Cookie 整理以下:api

 

  • 在浏览器中,模拟登录,抓取登录请求信息。

3255415-6c02f08c8697ef0c

从图中能够看到 _xsrf 参数, 这个参数与登录验证信息无关,但很明显是由登录页面携带的信息。 Google了下 xsrf 的含义, 用于防范 跨站请求伪造 。浏览器

3255415-6c02f08c8697ef0c

  • 整理以上,代码以下:

设置Bearer Token

通过上述步骤登录成功了,有点小激动,有没有! 但苦难到此还远没有结束,这个时候尝试抓取最近热门话题,直接返回 code:401 ,未受权的访问。 受权信息未设置,致使了此类错误,莫非遗漏了什么,看来只能在浏览器中追踪请求参数来侦测问题。 在浏览器的请求中,包含了Bearer Token, 而我在scrapy中模拟的请求中未包含此信息, 因此我被服务器认定为未受权的。 经过观察发现 Bearer Token 的关键部分,就是 Cookies 中的 z_c0 包含的信息。服务器

3255415-6c02f08c8697ef0c
z_c0 包含的信息,是在登录完成时种下的,因此从登录完成返回的登录信息里,获取要设置的 Cookie 信息, 而后拼接出 Bearer Token,最后设置到 Header 中。cookie

代码整理以下:app

 

获取数据

上述步骤后,数据获取就水到渠成了,为了检测成功与否, 把返回信息写到文件中,并且只获取前五十个,代码以下:

最终获取的数据以下图所示:

3255415-6c02f08c8697ef0c

写在最后

知乎的数据,只有登陆完成以后,才可有效的获取,因此模拟登录是没法忽略无论的。 所谓的模拟登录,只是在scrapy中尽可能的模拟在浏览器中的交互过程,使服务端无感抓包过程。 请求中附加有效的 Cookies 和 Headers 头信息,可有效的迷惑服务端, 同时在交互的过程当中,获取后续请求必要信息和认证信息,使得整个流程能不断先前。

相关文章
相关标签/搜索