Python 数据获取(五)—— 获取客户端渲染方式数据

        前面的例子都是获取的服务器渲染数据,本篇来尝试获取客户端渲染数据,案例就是CSDN,尝试用魔法打败魔法(狗头。

       目标:获取指定博主ID所有的文章标题、链接、阅读量。

一、 确认渲染方式

也就是要获取的数据在不在源代码中

       右键,查看网页源码,发现标题、链接、阅读数、点赞数等都有,开心地以为这是服务器渲染方式。

       但是再往下多滚几页,再点查看源码,你会发现源码一点变化都没有。所以其实这是客户端渲染方式,源码看到的那些数据只是框架而已。

       既然如此,应该直接去取它推送的格式化数据。

二、 获取数据准备

       回顾一下获取客户端渲染方式数据需要准备什么 Python 数据获取(一)—— request模块、变量使用与传参方式_Hehuyi_In的博客-CSDN博客_python request传参

1. 找到数据链接和参数

在博客主页 -> F12 -> network -> 往下滚直到出现第二页数据

可以看到,真正的数据页出现了。

Headers页面可以获取url和请求方式

https://blog.csdn.net/community/home-api/v1/get-business-list?page=2&size=20&businessType=lately&noMore=false&username=Hehuyi_In

Payload页可以获取参数

  

  • 这里只有page是会变的,通过循环,就可以获取到所有链接。

2. 获取总页数

       当然如果只是获取我自己的,标题栏瞄一眼就知道一共707篇,但批量获取就不靠谱了。

       不过,既然它在标题栏了,就肯定有办法获取到。

       重新打开F12 -> network -> 在博客主页刷新,找博客数相关的数据


看看这个url和参数

https://blog.csdn.net/community/home-api/v1/get-tab-total?username=Hehuyi_In

3. 整体思路

  • 访问blogs对应链接,获取总博客数
  • 访问真正数据链接,获取单页的博客标题、链接、阅读量等
  • 根据总博客数和每页size,计算循环次数,循环执行第二步
  • 数据保存

下面就按整体思路来逐步完成代码

三、 代码实现

1. 获取总博客数

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4542.2 Safari/537.36'}

def getBlogsCount(username):
    url = 'https://blog.csdn.net/community/home-api/v1/get-tab-total'
    params = {'username': username}
    resp = requests.get(url=url, headers=headers,params=params)
    # 注意要的是json数据而不是text文本
    # print(resp.json())                  # 输出为 {..., 'data': {..., 'ask': 0, 'video': 0, 'blink': 0, 'blog': 707, 'live': 0}}
    # print(resp.json()['data']['blog'])  # 输出为 707
    return resp.json()['data']['blog']

if __name__ == '__main__':
    username = "Hehuyi_In"
    getBlogsCount(username)

2. 获取单页数据

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4542.2 Safari/537.36'}

def getBlogsInfo(username):
    url = 'https://blog.csdn.net/community/home-api/v1/get-business-list'
    page = 2
    size = 20
    params = {'page':page,'size':size,'businessType':'lately','noMore':'false','username': username}
    resp = requests.get(url=url, headers=headers,params=params)
    # print(resp.json())                   # 输出为 {... 'data': {'list': [{..., 'title': 'postgresql源码学习(41)—— 崩溃恢复③ - 日志来源', ..., 'url': 'https://blog.csdn.net/Hehuyi_In/article/details/126494891',...,'viewCount': 568}
    for info in resp.json()['data']['list']:
        # 只获取blog信息,其他类型例如download链接则不保存
        if (info['type'] == 'blog'):
            print(info['title'])
            print(info['url'])
            print(info['viewCount'])
if __name__ == '__main__':
    username = "Hehuyi_In"
    getBlogsInfo(username)

3. 循环输出

getBlogsCount函数不变,增加了循环调用

def getBlogsInfo(username,blogs_count):
    url = 'https://blog.csdn.net/community/home-api/v1/get-business-list'
    size = 20
    # 总页数=int((总记录数-1)/每页数量)+1
    page_count = int((blogs_count-1)/size)+1
    # 循环处理每页
    for page in range(1,page_count+1):
        params = {'page':page,'size':size,'businessType':'lately','noMore':'false','username': username}
        resp = requests.get(url=url, headers=headers,params=params)
        # print(resp.json())                   # 输出为 {... 'data': {'list': [{..., 'title': 'postgresql源码学习(41)—— 崩溃恢复③ - 日志来源', ..., 'url': 'https://blog.csdn.net/Hehuyi_In/article/details/126494891',...,'viewCount': 568}
    for info in resp.json()['data']['list']:
        # 只获取blog信息,其他类型例如download链接则不保存
        if (info['type'] == 'blog'):
            print(info['title'])
            print(info['url'])
            print(info['viewCount'])
if __name__ == '__main__':
    username = "Hehuyi_In"
    blogs_count=getBlogsCount(username)
    getBlogsInfo(username,blogs_count)

4. 数据保存

这里把它们保存到excel,如果只是想要文章url,直接存到txt文档会更简单。

效果如下

稍微调整下格式

def saveBlogsInfo(username,blogs_count,filename):
    # 实例化excel文档
    wb = openpyxl.Workbook()
    # 获取当前sheet
    sheet = wb.active
    # 表头数据,是一个list
    header_list=['文章标题','文章链接','阅读量']
    sheet.append(header_list)

    # 获取博客数据
    url = 'https://blog.csdn.net/community/home-api/v1/get-business-list'
    size = 20
    # 总页数=int((总记录数-1)/每页数量)+1
    page_count = int((blogs_count-1)/size)+1
    # 循环处理每页
    for page in range(1,page_count+1):
        params = {'page':page,'size':size,'businessType':'lately','noMore':'false','username': username}
        resp = requests.get(url=url, headers=headers,params=params)
        # print(resp.json())                   # 输出为 {... 'data': {'list': [{..., 'title': 'postgresql源码学习(41)—— 崩溃恢复③ - 日志来源', ..., 'url': 'https://blog.csdn.net/Hehuyi_In/article/details/126494891',...,'viewCount': 568}

        for info in resp.json()['data']['list']:
            # 只获取blog信息,其他类型例如download链接则不保存
            if (info['type'] == 'blog'):
                info_list = []
                info_list.append(info['title'])
                info_list.append(info['url'])
                info_list.append(info['viewCount'])
                sheet.append(info_list)
    # 保存excel
    wb.save(filename)

if __name__ == '__main__':
    username = "Hehuyi_In"
    filename = username+"--CSDN文章信息.xlsx"
    blogs_count=getBlogsCount(username)
    saveBlogsInfo(username,blogs_count,filename)

四、 读取excel数据

算是个附加内容,保存到excel后怎么用Python读出来?

# 读取文件访问所有文章
def getExcelData(filename):
    # 打开excel文档
    wb = openpyxl.load_workbook(filename)
    # 获取当前sheet
    sheet = wb.active

    # iter_rows函数可以加各种参数用于获取指定行和列的数据,例如 min_row,max_row,min_col,max_col
    for row_list in sheet.iter_rows():
        for cell in row_list:
            # 注意这里是.value
            print(cell.value)

大功告成~

五、 完整代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time  : 2022-12-03 23:14
# @Author: Hehuyi_In
# @File  : get_csdn_utl.py

import requests
import openpyxl

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4542.2 Safari/537.36'}

def getBlogsCount(username):
    url = 'https://blog.csdn.net/community/home-api/v1/get-tab-total'
    params = {'username': username}
    resp = requests.get(url=url, headers=headers,params=params)
    # 注意要的是json数据而不是text文本
    # print(resp.json())                  # 输出为 {..., 'data': {..., 'ask': 0, 'video': 0, 'blink': 0, 'blog': 707, 'live': 0}}
    # print(resp.json()['data']['blog'])  # 输出为 707
    return resp.json()['data']['blog']

def saveBlogsInfo(username,blogs_count,filename):
    # 实例化excel文档
    wb = openpyxl.Workbook()
    # 获取当前sheet
    sheet = wb.active
    # 表头数据,是一个list
    header_list=['文章标题','文章链接','阅读量']
    sheet.append(header_list)

    # 获取博客数据
    url = 'https://blog.csdn.net/community/home-api/v1/get-business-list'
    size = 20
    # 总页数=int((总记录数-1)/每页数量)+1
    page_count = int((blogs_count-1)/size)+1
    # 循环处理每页
    for page in range(1,page_count+1):
        params = {'page':page,'size':size,'businessType':'lately','noMore':'false','username': username}
        resp = requests.get(url=url, headers=headers,params=params)
        # print(resp.json())                   # 输出为 {... 'data': {'list': [{..., 'title': 'postgresql源码学习(41)—— 崩溃恢复③ - 日志来源', ..., 'url': 'https://blog.csdn.net/Hehuyi_In/article/details/126494891',...,'viewCount': 568}

        for info in resp.json()['data']['list']:
            # 只获取blog信息,其他类型例如download链接则不保存
            if (info['type'] == 'blog'):
                info_list = []
                info_list.append(info['title'])
                info_list.append(info['url'])
                info_list.append(info['viewCount'])
                sheet.append(info_list)
    # 保存excel
    wb.save(filename)


# 读取文件访问所有文章
def getExcelData(filename):
    # 打开excel文档
    wb = openpyxl.load_workbook(filename)
    # 获取当前sheet
    sheet = wb.active

    # iter_rows函数可以加各种参数用于获取指定行和列的数据,例如 min_row,max_row,min_col,max_col
    for row_list in sheet.iter_rows():
        for cell in row_list:
            # 注意这里是.value
            print(cell.value)

if __name__ == '__main__':
    # 注意这个username实际对应的是CSDN个人中心里的用户id,只是为了对应网页中的参数名这里也叫username
    username = "Hehuyi_In"
    filename = username+"--CSDN文章信息.xlsx"
    blogs_count=getBlogsCount(username)
    saveBlogsInfo(username,blogs_count,filename)
    # getExcelData(filename)

参考

Python 数据获取(一)—— request模块、变量使用与传参方式_Hehuyi_In的博客-CSDN博客_python request传参

Python将word表格存入excel —— 格式化pg参数手册_Hehuyi_In的博客-CSDN博客_python word表格写入excel

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值