为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。
首先,我计划使用 Python 爬虫技术从评论区获取粉丝的名字。通过分析评论区的网页结构,我可以编写爬虫程序来提取相关数据。使用 Python 的请求库(如 Requests )和解析库(如 BeautifulSoup ),我可以发送请求并从页面中提取所需信息,例如粉丝的用户名。
一旦获取到了粉丝名字的列表,接下来我可以使用 Python 的随机化库(如random)来实现随机抽取的功能。通过调用适当的方法,我可以从粉丝名字的列表中随机选择若干位粉丝作为获奖者。
为了提高用户的操作便利性,让其能够轻松运行代码,我也会将代码打包成一个可执行的Python程序,以实现点击即可运行的功能。这样一来,用户只需双击该程序,而无需打开命令行或编辑器,就能直接执行代码。
- 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)
请注意,实际使用时,可以根据需要自定义请求头部。常用的请求头包括 “User-Agent”(用户代理,用于识别客户端浏览器/设备)、“Accept-Language”(接受的语言)、“Referer”(来源页面)等。
字符串格式化是一种将变量或数据插入到字符串中的方法,以创建具有特定格式的文本。在 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'))
要从给定的 URL 中获取参数 page=100,你可以使用 URL 解析库来解析 URL,并提取出所需的参数。
以下是使用 Python 的 urllib.parse 模块解析 URL 参数的示例代码:
from urllib.parse import urlparse, parse_qs url = "https://blog.csdn.net/phoenix/web/v1/comment/list/131760390?page=100&size=10&fold=unfold&commentId=" parsed_url = urlparse(url) query_params = parse_qs(parsed_url.query) page_value = query_params.get("page", [None])[0] print(page_value)
在上述示例中,我们首先使用 urlparse 函数解析 URL,然后使用 parse_qs 函数解析查询参数部分。parse_qs 函数将查询参数解析为字典,其中键是参数名称,值是参数值的列表。
然后,我们使用 query_params.get(“page”, [None])[0] 从字典中获取名为 page 的参数值。这将返回参数的值,如果该参数不存在,则返回 None。
输出结果将是 100,这是从 URL https://blog.csdn.net/phoenix/web/v1/comment/list/131760390?page=100&size=10&fold=unfold&commentId= 中提取的 page 参数的值。
请注意,如果 URL 的参数值是字符串形式,你可能需要根据需要进行进一步的类型转换。
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"]
for item in list: # 获取评论区每一条评论中粉丝的用户昵称 user_name = item["info"]["nickName"] # 博主自身的评论不参与抽奖 if user_name == editior_name: continue else: nums.append(user_name)
nums = [] ... nums.append(user_name)
#假设是抽5名幸运粉丝 for index in range(0,5): luck_fan = random.choice(nums) print("第" + str(index + 1) + "位幸运粉丝是" + 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): ...
from urllib.parse import urlparse, parse_qs ... JSON_path = input("请在键盘中输入博客中评论的JSON数据渲染路径(page=%s): ") # 解析URL parsed_url = urlparse(JSON_path) # 提取查询参数 query_params = parse_qs(parsed_url.query) # 获取page字段的值。替换为%s进行动态拼接 page_value = query_params.get('page', [''])[0] JSON_path = JSON_path.replace("page=" + str(page_value),"page=%s")
#评论大于10条会渲染脏数据,第1页数据不能取 if int(comment_num) >= 10: dirty_data_index = 1 else: dirty_data_index = 0 for index in tqdm(range(dirty_data_index, page_num),desc='抽奖中',ncols=80): ...
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
打包教程如下:http://t.csdn.cn/7I1yW
#打包后的程序持续显示5分钟后自动关闭 time.sleep(300)
JSON_path = input("请在输入博客中评论的JSON数据渲染路径(任意): ") # 解析URL parsed_url = urlparse(JSON_path) # 提取查询参数 query_params = parse_qs(parsed_url.query) # 获取page字段的值。替换为%s进行动态拼接 page_value = query_params.get('page', [''])[0] JSON_path = JSON_path.replace("page=" + str(page_value),"page=%s")
blog_id = input("请输入博客id: ") blog_url = "https://blog.csdn.net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold" ... url = blog_url % (index)
blog_id = input("请输入者博客地址或者博客id: ") #解析输入的博客地址,提前文章id parsed_url = urlparse(blog_id) path = parsed_url.path # 提取出目标字符串 blog_id = path.split('/')[-1] blog_url = "https://blog.csdn.net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold"
http://t.csdn.cn/k6DeM
from tqdm import * ... for index in tqdm(range(dirty_data_index, page_num),desc='抽奖中',ncols=80): ...
import json import math import random import time import requests from urllib.parse import urlparse, parse_qs from tqdm import * def main(): nums = [] nums_fold = [] content_fold = [] blog_id = input("请输入者博客地址或者博客id: ") # 解析输入的博客地址,提前文章id parsed_url = urlparse(blog_id) path = parsed_url.path # 提取出目标字符串 blog_id = path.split('/')[-1] blog_url = "https://blog.csdn.net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold" # fold 代表折叠的评论 blog_url_fold = "https://blog.csdn.net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=fold" # 一共有多少条评论,一个页面10条评论 comment_num = input("请输入博客中的总评论数量: ") page_num = math.ceil(int(comment_num) / 10) luck_fans_num = input("请输入最终中奖粉丝的数量: ") luck_fans_num = int(luck_fans_num) editior_name = input("请输入不参与此次抽奖的用户昵称(暂时限制0-1个): ") fold_into_unfold = input("是否将被折叠的评论加入奖池(y/n): ") print() #评论大于10条会渲染脏数据,第1页数据不能取 if int(comment_num) >= 10: dirty_data_index = 1 else: dirty_data_index = 0 for index in tqdm(range(dirty_data_index, page_num),desc='抽奖中',ncols=80): # 示例url : https://blog.csdn.net/phoenix/web/v1/comment/list/132666724?page=3&size=10&fold=unfold url = blog_url % (index) url_fold = blog_url_fold % (index) # 发送请求获取 HTML headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0", } #获取相应数据 response 并根据需求提取对应的 json 数据 response = requests.post(url, headers=headers) response_fold = requests.post(url_fold, headers=headers) html = response.text html_fold = response_fold.text json_data = json.loads(html) json_data_fold = json.loads(html_fold) list = json_data["data"]["list"] list_fold = json_data_fold["data"]["list"] for item in list: # 获取评论区每一条评论中粉丝的用户昵称,取得是info字段,不是sub字段 user_name = item["info"]["nickName"] # 博主自身的评论不参与抽奖 if user_name == editior_name: continue else: nums.append(user_name) for item in list_fold: # 获取评论区每一条评论中粉丝的用户昵称,取得是info字段,不是sub字段 user_name = item["info"]["nickName"] content = item["info"]["content"] # 博主自身的评论不参与抽奖 if user_name == editior_name: continue else: nums_fold.append(user_name) content_fold.append(content) print() if fold_into_unfold == 'y' or fold_into_unfold == 'Y': result = "参与抽奖活动的名单(包括被折叠的)如下:" + ', '.join(nums + nums_fold) print(str(int(comment_num) - len(nums) - len(nums_fold)) + " 条评论出现在同一楼,包括被折叠的一共 " + str(len(nums + nums_fold))+ " 条评论参与了此次抽奖" + '\n') else: result = "参与抽奖活动的名单(不包括被折叠的)如下:" + ', '.join(nums) print("一共有 " + comment_num + " 条评论,其中 " + str(len(nums_fold)) + " 条评论被折叠, " + str( int(comment_num) - len(nums) - len(nums_fold)) + " 条评论出现在同一楼,共 " + str(len(nums)) + " 条有效评论参与了此次抽奖" + '\n') result_content_fold = "由于评论过短,包含回访,评论内容无厘头等情况被折叠评论内容如下:" + ' | '.join(content_fold) print(result_content_fold + '\n') print(result + '\n') final_nums = [] if fold_into_unfold == 'y' or fold_into_unfold == 'Y': nums_jiangchi = nums + nums_fold else: nums_jiangchi = nums # 假设是抽5名幸运粉丝 for index in range(luck_fans_num): luck_fan = random.choice(nums_jiangchi) 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() # 打包后的程序持续显示5分钟后自动关闭 time.sleep(300)
1. 完成了基础的抽奖功能.
1. 新增作者不参与抽奖的功能特性
2. 修复了脏数据渲染的问题
3. 优化了输出语句,提升用户体验
1. 获取的JSON数据链接通过键盘输入
2. 将程序打包成.exe文件,无需下载安装任何软件或环境,点击即可运行
1. 实现通过输入文章 id 完成整体逻辑的运行
2. 优化了输出语句
1. 支持直接输入文章完整路径,程序自动提取文章id
2. 新增动态加载条效果
3. 新增添加被折叠评论的功能特性,并添加了更加详细的数据显示
欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)