一、基本原理
-
简书文章在账号未登陆的的情况下,每刷新一次页面,文章阅读量便会 + 1 。
-
通过上述思路,我们可以得出,只要不断在浏览器刷新页面(未登陆情况下),便可以达到增加阅读量的目的。
-
但上述方式,需要不断点击页面刷新按钮,足见效率低下。
-
我们知道,在浏览器中,页面刷新的本质就是重新向服务器发送get请求,因此,我们猜想,在程序中不断模拟浏览器发出get请求,同样可以达到刷简书文章的目的。
-
通过浏览器抓包分析,如下图所示
-
我们发现,在整个请求过程中,阅读量的增加,主要发生于该post请求。
-
因此,我们只需要在程序中不断发送post请求该接口,便可实现利用程序刷文章阅读量。
二、代码实现
- 具体代码如下所示
import json
import re
import requests
import threading
# 获取简书文章阅读量
def getReadCount(jianshu_Url):
# 请求头设置
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
}
# 请求页面,爬取页面源代码
result = requests.get(jianshu_Url, headers=headers)
# 使用正则表达式,在源代码中,获取表示当前文章浏览量的字符串
results = re.findall(r'"views_count":\d+', result.text)
# 返回结果
return results[0].split(':')[1]
# 增加阅读量
def addReadCount(jianshu_Url, readCountEnd):
# 请求体
payloadData = {
'fuck': 1
}
# 请求头设置
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36',
'Origin': 'https://www.jianshu.com',
'Referer': jianshu_Url
}
# 获取文章当前浏览量
nowReadCount = int(getReadCount(jianshu_Url))
# 循环发送post请求
temp = jianshu_Url["https://www.jianshu.com/p/a190a889563e".find("/p/") + 3:]
for i in range(nowReadCount, readCountEnd):
requests.post("https://www.jianshu.com/shakespeare/notes/" + temp + "/mark_viewed", data=json.dumps(payloadData), headers=headers)
print(i)
if __name__ == '__main__':
# 更改下方的两个参数即可
# 文章的请求路径
jianshu_Url = "https://www.jianshu.com/p/XXXXX"
# 需要刷到多少
readCountEnd = 1000
# 使用多线程,提高效率
for i in range(0, 30):
threading.Thread(target=addReadCount, args=(jianshu_Url, readCountEnd)).start()
-
上述变量,是一个“仅供参考”的变量,并不能决定,文章阅读量的最终结果,因为,在实际过程中,发现一个bug。
-
就是程序这边,有时候只发了一次post请求,但文章的阅读量却增加了 2 。
-
初步猜测,应该是简书服务器的bug,并非python程序问题!