前面的例子都是获取的服务器渲染数据,本篇来尝试获取客户端渲染数据,案例,尝试用魔法打败魔法(狗头。
目标:获取指定博主ID所有的文章标题、链接、阅读量。
一、 确认渲染方式
也就是要获取的数据在不在源代码中
右键,查看网页源码,发现标题、链接、阅读数、点赞数等都有,开心地以为这是服务器渲染方式。
但是再往下多滚几页,再点查看源码,你会发现源码一点变化都没有。所以其实这是客户端渲染方式,源码看到的那些数据只是框架而已。
既然如此,应该直接去取它推送的格式化数据。
二、 获取数据准备
回顾一下获取客户端渲染方式数据需要准备什么 Python 数据获取(一)—— request模块、变量使用与传参方式_Hehuyi_In的博客
1. 找到数据链接和参数
在博客主页 -> F12 -> network -> 往下滚直到出现第二页数据
可以看到,真正的数据页出现了。
Headers页面可以获取url和请求方式
?page=2&size=20&businessType=lately&noMore=false&username=Hehuyi_In
Payload页可以获取参数
- 这里只有page是会变的,通过循环,就可以获取到所有链接。
2. 获取总页数
当然如果只是获取我自己的,标题栏瞄一眼就知道一共707篇,但批量获取就不靠谱了。
不过,既然它在标题栏了,就肯定有办法获取到。
重新打开F12 -> network -> 在博客主页刷新,找博客数相关的数据
看看这个url和参数
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)
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)
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文档会更简单。
效果如下
稍微调整下格式
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)
大功告成~
五、 完整代码
#!/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