定义了一个名为HeiMaTouTiao
的类,其中包含了以下方法:
__init__(self)
: 初始化方法,设置请求头信息和授权令牌。get_comment(self, url)
: 异步方法,根据给定的URL发送GET请求,获取文章评论数据,并将其解析为JSON格式。然后提取所需的评论信息(标题、评论状态、总评论数和粉丝评论数),并将这些信息存储在一个字典列表中返回。save_data(self, li)
: 异步方法,将传入的字典列表li
写入到名为'toutiao.json'的本地文件中,以追加模式打开文件,并以UTF-8编码保存数据。run(self)
: 主方法,首先获取用户输入的起始页和结束页,然后循环遍历这些页面,调用get_comment
方法获取评论数据,并将结果添加到一个列表中。最后,调用save_data
方法将列表中的数据保存到本地文件中。
在程序的主函数部分,创建了一个HeiMaTouTiao
类的实例heimatoutiao
,然后记录开始时间,调用run
方法执行程序的主要逻辑,最后记录结束时间并打印总用时。
import aiofiles
import aiohttp
import asyncio
import json
import time
#url = f"http://api-toutiao-web.itheima.net/mp/v1_0/articles?page={i}&per_page=10&response_type=comment"
class HeiMaTouTiao:
def __init__(self):
self.headers = {
'User-Agent':'Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.1)',
'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MTUzNDM0NjIsInVzZXJfaWQiOjEsInJlZnJlc2giOmZhbHNlLCJ2ZXJpZmllZCI6dHJ1ZX0.r-80eL3EhmTuc3T5-rsuRFGlRm4-EViGqQbH5ez_iQQ'}
async def get_comment(self,url):
async with aiohttp.ClientSession() as session:
async with session.get(url=url, headers=self.headers)as resp:
comment = await resp.text()
content_li = []
data = json.loads(comment)
#print(data)
data = data['data']['results']
#print(data)
for index in range(len(data)):
content = dict()
content['标题'] = data[index]['title']
if data[index]['comment_status'] is True:
content['评论状态'] = '正常'
else:
content['评论状态'] = '关闭'
content['总评论数'] = data[index]['total_comment_count']
content['粉丝评论数'] = data[index]['fans_comment_count']
content_li.append(content)
return content_li
async def save_data(self,li):
async with aiofiles.open('toutiao.json', mode='a+', encoding='utf-8')as f:
await f.write(json.dumps(li, ensure_ascii=False, indent=2))
async def run(self):
li=[]
a = int(input('请输入抓取的起始页:'))
b = int(input('请输入抓取的结束页:'))
for i in range (a,b+1):
url = f"http://api-toutiao-web.itheima.net/mp/v1_0/articles?page={i}&per_page=10&response_type=comment"
print(f"正在请求P{i}:",url)
li += await self.get_comment(url)
await self.save_data(li)
if __name__ == '__main__':
heimatoutiao = HeiMaTouTiao()
start_time = time.time()
#asyncio.run(HMTT.run())
await heimatoutiao.run()
end_time = time.time()
print(f'总用时:{end_time - start_time}秒')