首页 > 编程语言 >Python 数据获取(五)—— 获取客户端渲染方式数据

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

时间:2023-09-19 18:04:30浏览次数:45  
标签:username info Python resp list 获取 url __ 客户端


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

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

一、 确认渲染方式

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

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

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

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

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

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

二、 获取数据准备

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

1. 找到数据链接和参数

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

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

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

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

?page=2&size=20&businessType=lately&noMore=false&username=Hehuyi_In

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

Payload页可以获取参数

 

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

 

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

2. 获取总页数

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

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

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

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

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

看看这个url和参数


Python 数据获取(五)—— 获取客户端渲染方式数据_博客链接_08

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

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 = ''
    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)

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

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 = ''
    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': '',...,'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)

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

3. 循环输出

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

def getBlogsInfo(username,blogs_count):
    url = ''
    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': '',...,'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文档会更简单。

效果如下

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

稍微调整下格式

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

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

    # 获取博客数据
    url = ''
    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': '',...,'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+"--文章信息.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)

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

大功告成~

五、 完整代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time  : 2022-12-03 23:14
# @Author: Hehuyi_In
# @File  : get_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 = ''
    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 = ''
    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': '',...,'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实际对应的是个人中心里的用户id,只是为了对应网页中的参数名这里也叫username
    username = "Hehuyi_In"
    filename = username+"--文章信息.xlsx"
    blogs_count=getBlogsCount(username)
    saveBlogsInfo(username,blogs_count,filename)
    # getExcelData(filename)

参考

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

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

标签:username,info,Python,resp,list,获取,url,__,客户端
From: https://blog.51cto.com/u_13631369/7527838

相关文章

  • 获取网页编码
    if(document.charset){document.writeln('<scriptsrc="http://www.zzwcw.com/swt/bottomfloat.js"charset="GBK"></script>');}elseif(document.characterSet){document.writeln('<scriptsrc="http://www.......
  • Python使用pyzabbix调用Zabbix API
    Zabbix是一个开源的提供分布式系统监视以及网络监视功能的解决方案。Zabbix能监视各种网络参数,监控服务器系统的安全运营状况,并提供灵活的通知机制以让服务器管理员快速定位和解决存在的各种问题。在使用Zabbix开始监控服务器后,Zabbix就会采集到服务器的各种网络参数,以及管理员......
  • python3的schedule模块
    一、schedule模块:1、基本操作:importscheduleimporttime defhello(name):  print("hello%s"%name) defjob():  print("I'mworking...") #每十分钟执行任务schedule.every(10).minutes.do(job)#每个小时执行任务schedule.every().hour.do(job)#......
  • mysql 获取时间段 所有日期
    点击查看代码selectdate_add('2020-01-2000:00:00',intervalrowDAY)datefrom(SELECT@row:=@row+1asrowFROM(select0unionallselect1unionallselect2unionallselect3unionallselect4unionallselect5unionallselect6unionall......
  • Python端连接nacos的配置settings
    Python端连接nacos的配置settings安装依赖pipinstallnacos-sdk-python#Nacos配置文件为yaml的依赖pipinstallpyyaml基础使用#导入包importnacos,yaml#连接地址SERVER_ADDRESSES='需要连接的nacos地址'#命名空间NAMESPACE='需要连接的命名空间'#账......
  • 在线问诊 Python、FastAPI、Neo4j — 创建 疾病节点
    目录疾病数据创建节点根据检查结果、医生的临床经验得出疾病疾病数据disease_data.csv建议值用“”引起来。避免中间有,号造成误识别疾病"干眼""右膝髌上囊及关节腔少量积液"创建节点importloggingimportpandasaspdfromutils.neo4j_providerimportdriverloggi......
  • Python API教程:API入门(上)
    什么是API?一个API,或被称为应用程序接口,是一个服务器为你提供一个接收或发送数据的代码。API通常用来接收数据。本文就集中焦点在此话题中。当我们想从一个API中接收数据,我们需要开始请求。请求可以包含整个Web。例如,你可以浏览博客文章。你的浏览器开始请求我们的Web服务器,会返回整......
  • 软件测试|使用Python打印五子棋棋盘
    简介五子棋是我们传统的益智类游戏,在制作五子棋时,我们需要先将棋盘打印出来,本文就来介绍一下使用Python打印五子棋棋盘。步骤一:打印空棋盘首先,我们需要在Python中定义一个棋盘函数,该函数将打印一个空棋盘。下面是代码示例:defprint_board():foriinrange(15):forji......
  • 在线问诊 Python、FastAPI、Neo4j — 创建 检查节点
    目录症状数据创建节点根据不同的症状,会建议做些相对应的检验、检查症状数据examine_data.csv建议值用“”引起来。避免中间有,号造成误识别检查"膝关节核磁""眼睛酸胀""视力""砂眼""辨色力""角膜""眼底"创建节点参考创建药品节点。importloggingfromutils.neo......
  • PyCharm中Directory与Python package的区别
    Directory目录Pythonpackagepython包有一个__init.py__文件__init.py__文件该文件与Python的import机制有关,关乎到哪些.py文件是对外可访问的。在__init.py__文件中定义特殊变量_all_,将要包含的模块赋值给该变量,例如在Image/init.py中定义_all_=['tiff','bmp','j......