为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
- BeautifulSoup 是一个 Python 库,用于网络爬虫目的。它提供了一种方便和高效的方式来从 HTML 和 XML 文档中提取数据。使用 BeautifulSoup,你可以解析和遍历 HTML 结构,搜索特定元素,并从网页中提取相关数据。
- 该库支持不同的解析器,如内置的 Python 解析器、lxml 和 html5lib,允许你根据特定需求选择最适合的解析器。BeautifulSoup 的优势在于它能够处理格式混乱或损坏的 HTML 代码,使其成为处理复杂情况下的网络爬虫任务的强大工具。
import requests
from bs4 import BeautifulSoup
# 发送请求获取 HTML
response = requests.get(url)
html = response.text
# 创建 Beautiful Soup 对象
soup = BeautifulSoup(html, 'html.parser')
# 通过选择器选择 DOM 元素进行操作
element = soup.find('div',id='my-element')
解析一个请求主要关注以下几个方面
以下是一个示例代码
import json
import requests
def main():
#这是获取广州青年报响应数据的一个模拟测试类
url = 'https://www.gzyouthnews.org.cn/index/index'
header = {
'X-Requested-With':'XMLHttpRequest'
}
data={
'act':'list',
'date':'2023-08-10',
'paper_id':1
}
res = requests.post(url=url,headers=header,data=data)
list = json.loads(res.text)
for i in list:
print(i.get('edition'))
if __name__ == '__main__':
main()
import requests
url = "https://example.com"
headers = {
"User-Agent": "Mozilla/5.0",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://example.com",
# 添加其他常用请求头...
}
response = requests.get(url,stream=True, headers=headers)
字符串格式化是一种将变量或数据插入到字符串中的方法,以创建具有特定格式的文本。在 Python 中,字符串格式化可以通过多种方式实现。
一种常用的字符串格式化方式是使用百分号(%)操作符。这种方法使用占位符来表示要插入的变量,并在%操作符后面提供相应的值。例如:
name = "Alice"
age = 25
message = "My name is %s and I am %d years old." % (name, age)
print(message)
输出结果将是:
My name is Alice and I am 25 years old.
在上面的例子中,%s 是字符串占位符,%d 是整数占位符。% 操作符后的括号中依次提供了要插入的变量(name 和 age)。
import json
# 假设你已经获取到了 JSON 数据,将其存储在 json_data 变量中
json_data = '''
{
"status": 200,
"message": "success",
"datatype": "json",
"data": {
"pageArticleList": [
{
"indexnum": 0,
"periodid": 20200651,
"ordinate": "",
"pageid": 2020035375,
"pagenum": "6 科协动态",
"title": "聚焦“科技创新+先进制造” 构建社会化大科普工作格局"
}
]
}
}
'''
# 解析 JSON 数据
data = json.loads(json_data)
# 提取 title 属性的值
title = data["data"]["pageArticleList"][0]["title"]
# 输出 title 属性的值
print(title)
在上述示例中,我们将示例数据存储在 json_data 字符串中。然后,我们使用 json.loads() 函数将字符串解析为 JSON 数据,将其存储在 data 变量中。
然后,我们可以通过字典键的层级访问方式提取 title 属性的值。在这个示例中,我们使用 data[“data”][“pageArticleList”][0][“title”] 来获取 title 属性的值(类似于数组,一个层级就用一个[])。
最后,我们将结果打印出来或根据需求进行其他处理。
或者是用 get() 获取具体属性的值
list = json.loads(res.text)
for i in list:
print(i.get('edition'))
https://blog.csdn.net/phoenix/web/v1/comment/list/132666724?page=2&size=10&fold=unfold
#假设有19页评论
for index in range(0,20):
# 示例博客地址
url = "https://blog.csdn.net/phoenix/web/v1/comment/list/132666724?page=%s&size=10&fold=unfold" % (index)
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
}
response = requests.post(url,headers=headers)
html = response.text
json_data = json.loads(html)
list = json_data["data"]["list"]
for item in list:
# 获取评论区每一条评论中粉丝的用户昵称
user_name = item["info"]["nickName"]
nums = []
...
nums.append(user_name)
#假设是抽5名幸运粉丝
for index in range(0,5):
luck_fan = random.choice(nums)
print("第" + str(index) + "位幸运粉丝是" + luck_fan)
#一共有多少条评论,一个页面10条评论
comment_num = input("请输入博客中的评论数量: ")
comment_num = int(comment_num)
luck_fans_num = input("请在键盘输入最终中奖粉丝的数量: ")
luck_fans_num = int(luck_fans_num)
#有多少页评论循环多少次
for index in range(0, int(comment/10)):
...
#假设是抽5名幸运粉丝
for index in range(0,luck_fans_num):
...
# 获取评论区每一条评论中粉丝的用户昵称,取得是info字段,不是sub字段
user_name = item["info"]["nickName"]
# 博主自身的评论不参与抽奖
if user_name == editior_name:
continue
else:
nums.append(user_name)
#去除浏览器自动多渲染的结尾的10个脏数据
for index in range(1, 11):
nums.remove(nums[len(nums) - index])
final_nums = []
#假设是抽5名幸运粉丝
for index in range(0,luck_fans_num):
luck_fan = random.choice(nums)
if luck_fan not in final_nums:
final_nums.append(luck_fan)
else:
index = index - 1
continue
import json
import math
import random
import requests
def main():
nums = []
# 一共有多少条评论,一个页面10条评论
comment_num = input("请在键盘中输入博客中的总评论数量: ")
comment_num = math.ceil(int(comment_num) / 10)
luck_fans_num = input("请在键盘中输入最终中奖粉丝的数量: ")
luck_fans_num = int(luck_fans_num)
editior_name = input("请在键盘中输入不参与此次抽奖的用户昵称: ")
for index in range(0, comment_num):
# 示例博客地址,即使是自己的博客,每天的API接口也会更新,折叠评论的链接地址参数fold=fold
url = "https://blog.csdn.net/phoenix/web/v1/comment/list/132666724?page=%s&size=10&fold=unfold" % (index)
# 发送请求获取 HTML
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0",
}
response = requests.post(url, headers=headers)
html = response.text
json_data = json.loads(html)
list = json_data["data"]["list"]
for item in list:
# 获取评论区每一条评论中粉丝的用户昵称,取得是info字段,不是sub字段
user_name = item["info"]["nickName"]
# 博主自身的评论不参与抽奖
if user_name == editior_name:
continue
else:
nums.append(user_name)
# 去除浏览器自动多渲染的结尾的10个脏数据
for index in range(1, 11):
nums.remove(nums[len(nums) - index])
print("不包括博主在内一共有" + str(len(nums)) + "条有效评论参与了此次抽奖")
result = "参与抽奖活动的粉丝名单(不包括被折叠的)如下:" + ', '.join(nums)
print(result)
final_nums = []
# 假设是抽5名幸运粉丝
for index in range(0, luck_fans_num):
luck_fan = random.choice(nums)
if luck_fan not in final_nums:
final_nums.append(luck_fan)
else:
index = index - 1
continue
print("第" + str(index + 1) + "位幸运粉丝是 >>>>>> " + luck_fan)
if __name__ == '__main__':
main()
别忘了路径中的page=%s,进行动态拼接
那么,如何快速找到自己博客评论区对应的 JSON 数据接口呢,如下图
1. 完成了基础的抽奖功能.
1. 新增作者不参与抽奖的功能特性
2. 删除掉自动渲染在末尾的10个脏数据
3. 优化了输出语句,提升用户体验
欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)