这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战。
最近掘友们在疯狂的晒自己的猫猫,同时,又有广大掘友在疯狂的云吸猫!
我也一样,但是我觉得有点不过瘾,如果能够把你们的猫都搞到手就好了,全部为我所有!
但这不可能实现,很失望,怎么办呢?
有了!!!虽然搞不到你们的猫,那就退一步,搞到你们的猫的照片,四舍五入一下,不就相当于搞到你们的猫了吗!机智!!!!
那怎样搞到所有猫的照片呢?
一个一个的右键另存为? 不可能的!我来爬一下试试!
掘金运营大大不要封我ip封我号,毕竟我只是一个想撸猫的普通群众(小声哔哔)!
开干!!
分析网站
通过抓包,我找到了沸点的请求接口,如下:
我大胆猜一下,"theme_id": "7007350783603638279"
大概就是"猫星人最可爱的一点"的话题,limit
是每次请求的沸点条数,sort
是热门和最新两种排序方式,cursor
大概就是游标,代表从哪一条开始请求。
通过分析返回体,证明我的猜想是正确的,哈!
而且,我在返回体里找到了,你们的用户名,沸点的内容,以及你们发的猫····的照片url链接!优秀啊!!
那么现在,只差代码了。这都是小事!
编写程序
到这里,我似乎发现事情有些不对了!
上面说的cursor
是一个"eyJ2IjoiNzAyMzU5NjI1MjkzNTc2NjA1MyIsImkiOjEyMH0=",这是个什么玩意,明显加密了啊!
于是,我开始尝试解密,看看加密前的是什么。我发现是通过Base64的方式进行加密的,哇,也太仗义了,我以为会是什么奇奇怪怪的加密方式,就到这走不下去了呢!
如下,解密出来是{"v":"7023596252935766053","i":100}
字符串,根据我的经验来看,里面的i
就是游标,代表着从那一条开始。
整明白了!开干!
代码实现
请求数据加密
def base64_encrypt(text):
"""
base64加密
:param text: 文本
:return:
"""
encrypt = base64.b64encode(str(text).encode('utf-8'))
return str(encrypt, "utf-8")
单页爬取测试
先把cursor
数据内的i
设置为0,爬取第一页测试一下:
import base64
import requests
def jujin_cat_spider():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/81.0.4044.43 Safari/537.36',
'Referer': 'https://juejin.cn/'
}
url = "https://api.juejin.cn/content_api/v1/short_msg/list_by_theme?aid=2608&uuid=6983930498641806848"
cursor = '{"v":"7023596252935766053","i":0}'
cursor = base64_encrypt(cursor)
print("加密后:", cursor)
data = {
"theme_id": "7007350783603638279",
"sort": 1,
"limit": 20,
"cursor": cursor
}
res = requests.post(url, json=data, headers=headers)
print(res.json())
jujin_cat_spider()
经测试,完美运行,可以得到第一页的数据,上面已经说过,返回体内的msg_Info
里面的pic_list
是猫的照片列表,循环所有的沸点数据,再循环照片列表把照片下载下来即可。
我感觉胜利就在眼前了,这里提前庆祝一下~
翻页爬取
接下来唯一要做的就是构造翻页请求了,通过查看返回体,我看到有个has_more
属性,代表着是否有下一页,那就好办了,判断一下就可以,如果有下一页,把cursor
数据内的i
加20,请求下一页的数据就行了,知道has_more
为Fslse
停止。
运行过程截图:
大功告成!! 共爬下来几百张猫猫的照片,下面是部分截图,看看有没有你家的哈哈哈!
完整代码就不放了,毕竟我还要在掘金混的,万一造成不好的影响,啪!把我号一封!我以后还怎么在掘金摸鱼哈哈哈!
原创不易,如果小伙伴们觉得有帮助,麻烦点个赞再走呗~
最后,感谢女朋友在工作和生活中的包容、理解与支持 !