「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
很多平台都有点赞功能,今天提供的这个思路可用于很多平台,希望可以掌握该技巧,实现你自己的点赞器。本案例目标为虎嗅 24 小时频道点赞。
爬取前的分析
分析热点数据来源
该案例在分析阶段需要费一些时间,过程中有那么一点点的难度,理解之后,你将学到一个非常常用的爬虫编写技巧。
拖动浏览器滚动条到页面最底部,捕获请求:https://moment-api.huxiu.com/web-v2/moment/feed
该内容的请求数据与返回数据分别如下图所示。
请求方式为POST
。
请求数据为三个值,后面两个应为固定值,第一个 last_dateline
需要找到参数值来源才可以解开本案例。
返回的数据嵌套的层级比较多,看起来复杂,不过数据格式为 JSON 格式,正常解析即可。
上述代码还有一个重点内容,就是返回的数据中,其实提供了参数 last_dateline
的值,那这样就可以通过一个死循环一直查找下去,直到数据获取失败结束循环。
到此,数据获取分析完毕,得到结论如下:
- 请求方式为 POST;
- 请求地址为 moment-api.huxiu.com/web-v2/mome…
- 请求参数为
last_dateline
,platform
,is_ai
; - 第一次请求可以先固定一个
last_dateline
的值; - 通过循环获取所有的 热点信息。
分析点赞接口
点击点赞按钮抓取到的链接为 https://moment-api.huxiu.com/web/moment/agree
,该链接为点赞请求地址。
请求方式与地址如下,依旧为 POST
请求方式:
请求数据如下图所示:
参数中 moment_id
应该为上文获取到的热点 monent_id
,具体位置如图:
请求成功之后返回的数据格式如下图所示。
到此,点赞接口分析完毕,得到结论如下:
- 请求方式为 POST;
- 请求地址为 moment-api.huxiu.com/web/moment/…
- 请求参数为
monent_id
,platform
; - 测试代码时可以先发起一个请求,
monent_id
的值固定一个值即可。
爬虫编写时间
requests post 请求介绍
下面进入到爬虫的具体编写过程中,首先了解下 requests
库如何发起 POST
请求吧。
POST
请求在 requests
中存在几种用法,分别如下。
普通的 post 使用最多
实现方式,就是简单地传递一个字典给 data 参数即可。
1 | python复制代码import requests |
注意返回数据中存在 <Response [200]>
即表示成功。
data 参数传入一个元组列表
如果待提交的表单中多个元素使用同一 key 的时候,这种方式尤其有效。
1 | python复制代码import requests |
传递一个 JSON 字符串
发送的数据并非编码为表单形式,需要传递一个字符串,而不是一个字典。
1 | python复制代码import requests |
传递文件
该内容就有点超出爬虫小课大纲了,暂时忽略。
注意到,POST 和 GET 的区别其实就是 data
这个参数的区别,下面就可以实际编码了。
获取待点赞数据
首先获取 一页待点赞的数据,代码如下:
1 | python复制代码def get_feed(): |
实验中发现其实第一次获取可以将 last_dateline
置为空也可。后续循环的代码部分留给大家,爬虫小课已经接近尾声,剩下的你需要自己在扩展一部分 Python 基础语法。
点赞代码编写
点赞代码编写的过程中碰到了一点点小问题,该问题涉及 cookies
这个老大难问题。
1 | python复制代码import requests |
上述代码在运行过程中发现,得到的请求结果是:
1 | python复制代码{'success': False, 'message': '请开启COOKIE'} |
再次核对开发者工具捕获的请求,确实发现一个独特的 cookie
,具体如下:
一个 huxiu_analyzer_wcy_id
参数,看来问题出现在这里。这个值的获取就变得比较麻烦了,需要想办法捕获到。
这个地方橡皮擦是按照下述步骤解决的,希望你可以学会该类型问题或者说常见的找 cookie 的办法。
打开谷歌浏览器无痕模式,输入 https://www.huxiu.com/moment/
直接进行跳转,打开无痕模式的原因是因为需要确保 cookie 没有被缓存下来。
接下来在开发者工具中直接检索 huxiu_analyzer_wcy_id
参数。
得到如下内容:
这里就发现了该 cookie 设置的地方,发现该 cookie 是由 checklogin
这个接口响应并设置的。
接下来的解决办法就非常粗暴了,看一下 checklogin
是如何调用的,然后请求一下,保存它响应的 cookie 值,然后在去请求点赞接口。
最终修改点赞代码,完成任务:
1 | python复制代码def agree(moment_id): |
运行上述代码得到正确的点赞成功说明。
1 | python复制代码{'success': True, 'message': '点赞成功'} |
最后在啰嗦两句
本篇博客主要用于介绍 requests
库的 post
请求方式,顺带着给大家写了一下 cookie 的一般获取方式,这里要提醒一句在爬虫编写的过程中,开发者工具中的查找是经常用到的,尤其是在解决 JS 加密问题的时候。
本文转载自: 掘金