虎嗅 24 小时点赞器,一个案例附带一个爬虫技巧,Pytho

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

很多平台都有点赞功能,今天提供的这个思路可用于很多平台,希望可以掌握该技巧,实现你自己的点赞器。本案例目标为虎嗅 24 小时频道点赞。
虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

爬取前的分析

分析热点数据来源

该案例在分析阶段需要费一些时间,过程中有那么一点点的难度,理解之后,你将学到一个非常常用的爬虫编写技巧。

拖动浏览器滚动条到页面最底部,捕获请求:https://moment-api.huxiu.com/web-v2/moment/feed 该内容的请求数据与返回数据分别如下图所示。

请求方式为POST

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

请求数据为三个值,后面两个应为固定值,第一个 last_dateline 需要找到参数值来源才可以解开本案例。

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

返回的数据嵌套的层级比较多,看起来复杂,不过数据格式为 JSON 格式,正常解析即可。

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

上述代码还有一个重点内容,就是返回的数据中,其实提供了参数 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 请求方式:

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

请求数据如下图所示:

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

参数中 moment_id 应该为上文获取到的热点 monent_id,具体位置如图:

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

请求成功之后返回的数据格式如下图所示。

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

到此,点赞接口分析完毕,得到结论如下:

  • 请求方式为 POST;
  • 请求地址为 moment-api.huxiu.com/web/moment/…
  • 请求参数为 monent_id,platform
  • 测试代码时可以先发起一个请求,monent_id 的值固定一个值即可。

爬虫编写时间

requests post 请求介绍

下面进入到爬虫的具体编写过程中,首先了解下 requests 库如何发起 POST 请求吧。

POST 请求在 requests 中存在几种用法,分别如下。

普通的 post 使用最多
实现方式,就是简单地传递一个字典给 data 参数即可。

1
2
3
4
5
6
7
8
python复制代码import requests
# 该网址专门用于测试使用
url = 'http://httpbin.org/post'
data = {'key1':'value1','key2':'value2'}
r =requests.post(url,data)
print(r)
print(r.text)
print(r.content)

注意返回数据中存在 <Response [200]> 即表示成功。

data 参数传入一个元组列表

如果待提交的表单中多个元素使用同一 key 的时候,这种方式尤其有效。

1
2
3
4
5
6
7
python复制代码import requests
# 该网址专门用于测试使用
url = 'http://httpbin.org/post'
payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', data=payload)

print(r.text)

传递一个 JSON 字符串

发送的数据并非编码为表单形式,需要传递一个字符串,而不是一个字典。

1
2
3
4
5
6
7
8
9
10
python复制代码import requests
import json

# 该网址专门用于测试使用
url_json = 'http://httpbin.org/post'
# dumps:将python对象解码为json数据
data_json = json.dumps({'key1': 'value1', 'key2': 'value2'})
r_json = requests.post(url_json, data_json)

print(r_json.text)

传递文件

该内容就有点超出爬虫小课大纲了,暂时忽略。

注意到,POST 和 GET 的区别其实就是 data 这个参数的区别,下面就可以实际编码了。

获取待点赞数据

首先获取 一页待点赞的数据,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
python复制代码def get_feed():
# 拼接数据字典
data = {
"last_dateline": "1605591900",
"platform": "www",
"is_ai": 0
}
r = requests.post(
"https://moment-api.huxiu.com/web-v2/moment/feed", data=data)
data = r.json()
# data["success"]

# 获取数据,注意嵌套的层次有点多,慢慢对应即可
datalist = data["data"]["moment_list"]["datalist"][0]["datalist"]
print(datalist)

实验中发现其实第一次获取可以将 last_dateline 置为空也可。后续循环的代码部分留给大家,爬虫小课已经接近尾声,剩下的你需要自己在扩展一部分 Python 基础语法。

点赞代码编写

点赞代码编写的过程中碰到了一点点小问题,该问题涉及 cookies 这个老大难问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
python复制代码import requests
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}

def agree(moment_id):

data = {
"moment_id": moment_id,
"platform": "www",
}

r = requests.post(
"https://moment-api.huxiu.com/web/moment/agree", data=data, headers=headers)
res_data = r.json()
print(res_data)
# print(res_data["success"] == "true")

if __name__ == "__main__":
agree(130725)

上述代码在运行过程中发现,得到的请求结果是:

1
python复制代码{'success': False, 'message': '请开启COOKIE'}

再次核对开发者工具捕获的请求,确实发现一个独特的 cookie,具体如下:

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

一个 huxiu_analyzer_wcy_id 参数,看来问题出现在这里。这个值的获取就变得比较麻烦了,需要想办法捕获到。

这个地方橡皮擦是按照下述步骤解决的,希望你可以学会该类型问题或者说常见的找 cookie 的办法。

打开谷歌浏览器无痕模式,输入 https://www.huxiu.com/moment/ 直接进行跳转,打开无痕模式的原因是因为需要确保 cookie 没有被缓存下来。

接下来在开发者工具中直接检索 huxiu_analyzer_wcy_id 参数。

得到如下内容:

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

这里就发现了该 cookie 设置的地方,发现该 cookie 是由 checklogin 这个接口响应并设置的。

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

接下来的解决办法就非常粗暴了,看一下 checklogin 是如何调用的,然后请求一下,保存它响应的 cookie 值,然后在去请求点赞接口。

最终修改点赞代码,完成任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
python复制代码def agree(moment_id):
s = requests.Session()
r = s.get("https://www-api.huxiu.com/v1/user/checklogin", headers=headers)

jar = r.cookies
print(jar.items())
data = {
"moment_id": moment_id,
"platform": "www",
}

r = s.post(
"https://moment-api.huxiu.com/web/moment/agree", data=data, headers=headers, cookies=jar)
res_data = r.json()
print(res_data)
# print(res_data["success"] == "true")

运行上述代码得到正确的点赞成功说明。

1
python复制代码{'success': True, 'message': '点赞成功'}

最后在啰嗦两句

本篇博客主要用于介绍 requests 库的 post 请求方式,顺带着给大家写了一下 cookie 的一般获取方式,这里要提醒一句在爬虫编写的过程中,开发者工具中的查找是经常用到的,尤其是在解决 JS 加密问题的时候。

虎嗅 24 小时点赞器,可扩展到多平台,Python 爬虫小课 7-9

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%