写点什么

1 行代码爬 CSDN 热榜,Python 哈啤酒式写法

发布于: 4 小时前

橡皮擦,一个逗趣的互联网高级网虫

项目背景

群友:擦姐,CSDN 热榜数据最少能用几行代码爬取?擦姐:估计 10 行吧。群友:oh baby,show me your code!


项目的需求就是这么来的,用最少行数的代码爬 CSDN 热榜。


其中导入模块可以不算在代码行数中。


看到最后,请把 ==感受== 打在评论区

爬虫分析

待爬取目标:https://blog.csdn.net/rank/list


数据接口,两次请求获取热榜前 100 数据。


https://blog.csdn.net/phoenix/web/blog/hotRank?page=0&pageSize=50https://blog.csdn.net/phoenix/web/blog/hotRank?page=1&pageSize=50
复制代码


数据返回格式:JSON


{  "code": 200,  "message": "success",  "data": [    # 实际数据  ]}
复制代码


分析完毕,开始编码,全套代码可直接使用 requests 库。

热榜爬虫

这么简单的代码,首先编写一个基础爬虫,获取到数据,然后再对其进行优化。


import requestsimport json
for i in range(2): headers = { "user-agent": "Baiduspider" } res = requests.get(f"https://blog.csdn.net/phoenix/web/blog/hotRank?page={i}&pageSize=50", headers=headers) data = res.json() if data["code"] == 200: data = data["data"]
with open(f"{i}.json", "w+", encoding="utf-8") as f: f.write(json.dumps(data))
复制代码


运行代码,会在代码目录中生成两个 json 文件,每个文件存在 50 条数据,即热榜所有数据。


以上代码合计 12 行,接下来内卷开始,让代码行数变短。

缩写变量的声明

import requestsimport jsonfor i in range(2):    json_data = requests.get(f"https://blog.csdn.net/phoenix/web/blog/hotRank?page={i}&pageSize=50",headers={"user-agent": "Baiduspider"}).json()    if json_data and json_data["code"] == 200:        with open(f"{i}.json", "w+", encoding="utf-8") as f:            f.write(json.dumps(json_data))
复制代码


进行简单整理,从 12 行降低到 7 行,略有进步。


再将代码开头部分的 jsonrequests 合并为一行,代码降低为 6 行。

增加生成器代码

将循环部分替换为生成器,进行代码再次精简,本步减少代码比较少,只减少 1 行代码。


import requests, jsonfor i, data in enumerate([requests.get(f"https://blog.csdn.net/phoenix/web/blog/hotRank?page={i}&pageSize=50",headers={"user-agent": "Baiduspider"}).json() for i in range(2)]):    with open(f"{i}.json", "w+", encoding="utf-8") as f:        f.write(json.dumps(data))
复制代码


请忽略自动折行代码,目前剩余 4 行代码。


继续优化,将折行与 json 模块去除掉。

换行也去除

import requestsfor i, data in enumerate([requests.get(f"https://blog.csdn.net/phoenix/web/blog/hotRank?page={i}&pageSize=50", headers={"user-agent": "Baiduspider"}).text for i in range(2)]):    with open(f"{i}.json", "w+", encoding="utf-8") as f: f.write(data)
复制代码


按照上述代码整理之后,此时只剩下 3 行代码。


这难道是极限了吗?我们就不能写出正常人理解不了的代码吗?

1 行代码最终版

使用最简单的知识,实现最刺激的效果,为了让代码到最少行数,我写出了下面这个版本。


import requestswith open("file.json", "a+", encoding="utf-8") as f: [f.write(my_str + "\n") for my_str in [    requests.get(f"https://blog.csdn.net/phoenix/web/blog/hotRank?page={i}&pageSize=50",                 headers={"user-agent": "Baiduspider"}).text for i in range(2)]]
复制代码


你没看错,除去 模块导入外,只有 1 行代码。


这行代码展开之后长成下面的样子,一大长行,而它抓到了热榜 100 数据。


with open("file.json", "a+", encoding="utf-8") as f: [f.write(my_str + "\n") for my_str in [requests.get(f"https://blog.csdn.net/phoenix/web/blog/hotRank?page={i}&pageSize=50",headers={"user-agent": "Baiduspider"}).text for i in range(2)]]
复制代码



到最后,你肯定冒出了很多问号,请把 ==你想说的那个字== 打在评论区,没准还能中奖。


发布于: 4 小时前阅读数: 2
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
1行代码爬CSDN热榜,Python哈啤酒式写法