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

项目背景

群友:擦姐,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=50
https://blog.csdn.net/phoenix/web/blog/hotRank?page=1&pageSize=50

数据返回格式:JSON

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

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

热榜爬虫

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

import requests
import 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 requests
import json
for 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, json
for 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 requests
for 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 requests
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)]]

你没看错,除去 模块导入外 ,只有 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)]]

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

抽奖环节(目前累计送出 2 份)

只要评论数过 50
随机抽取一名幸运读者
奖励 39.9 元爬虫 100 例专栏 1 折购买券一份 ,只需 3.99 元

今天是持续写作的第 159 / 200 天。
求点赞 、求评论、求收藏 。

本文版权归趣快排营销www.seoguRubloG.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系✚Qq61910465