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

爬虫分析
 
待爬取目标: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
 
1
 
2
 
数据返回格式: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 行,略有进步。
 
再将代码开头部分的 json 和 requests 合并为一行,代码降低为 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://b

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64976.shtml

张贴在3