网爬,使用asyncio

 

定义了一个名为HeiMaTouTiao的类,其中包含了以下方法:

  1. __init__(self): 初始化方法,设置请求头信息和授权令牌。
  2. get_comment(self, url): 异步方法,根据给定的URL发送GET请求,获取文章评论数据,并将其解析为JSON格式。然后提取所需的评论信息(标题、评论状态、总评论数和粉丝评论数),并将这些信息存储在一个字典列表中返回。
  3. save_data(self, li): 异步方法,将传入的字典列表li写入到名为'toutiao.json'的本地文件中,以追加模式打开文件,并以UTF-8编码保存数据。
  4. 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}秒')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值