51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1610|回复: 3
打印 上一主题 下一主题

关于python异步协程的问题,求解?

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 530 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2021-10-14 14:32:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1测试积点

    具体过程就是,在写爬取一个小说网站的小爬虫
    大概架构是:
    1、先从目录页入手找到各个子页面的地址
    2、再通过子页面地址用正则抓取到正文内容
    3、将上述第二步,抓取正文内容的过程,改为异步协程的方法,同时抓取

    现在1、2步以实现,在同步状态下可以正常运行;但是根据小子网上学的改为异步协程方法进行修改后;却报错无法执行,望老鸟指教
    以下是拿来练手的小说地址:https://book.qidian.com/info/1030136856/#Catalog

    以下为报错内容:

    1. import requests
    2. import asyncio  
    3. import aiohttp  
    4. import aiofiles
    5. import json
    6. import re  
    7. #用来提取子页面地址的正则
    8. obj1=re.compile(r'<a class="subscri" href="//read.qidian.com/hankread/1030136856/94755936/" target="_blank"><!--<em class="btn"><b class="iconfont"></b>分卷阅读</em>--></a>.*?<ul class="cf">(?P<all>.*?) <div class="book-content-wrap cf">',re.S)
    9. obj2=re.compile(r'<li data-rid=.*?><a href="(?P<url>.*?)'
    10.                 r'title=".*?">(?P<name>.*?)</a>',re.S)
    11. #用来提取小说正文的正则
    12. obj3=re.compile(r'<div class="read-content j_readContent" id="">(?P<main>.*?)</div>.*?<div class="admire-wrap">',re.S)
    13. headers={
    14. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 OPR/78.0.4093.184'
    15. }
    16. #提取到的页面子链接需要补充:https:
    17. child_supplement='https:'
    18. #拿到章节子页面地址
    19. async def getintroduction(url,headers):
    20.     resp=requests.get(url)
    21.     chapter=resp.text
    22.     #print(resp.text)
    23.     urls=[]  #准备一个列表放提取到的url
    24.     #用正则提取章节子页面地址
    25.     #第一次先提取整个网页中的目录模块
    26.     result=obj1.finditer(chapter)
    27.     for it in result:
    28.         #print(it.group('all'))
    29.         table=it.group('all')
    30.     #第二次再分开提取每个章节的URL
    31.     content=obj2.finditer(table)
    32.     for it in content:
    33.         #print(it.group('name'))
    34.         #print(it.group('url'))
    35.         name = it.group('name')
    36.         url =child_supplement+it.group('url')  #对提取到的链接进行拼接
    37.         #准备异步任务,把提取到的url,放到一个列表里
    38.         urls.append(aiodownload(url,name))
    39.         #print(urls)
    40.     resp.close()
    41.     await asyncio.wait(urls)

    42. #读取子页面的正文内容
    43. async def aiodownload(url,name):
    44.     async with aiohttp.ClientSession() as session:
    45.         async with session.get(url) as resp:  # 得到每个章节子页面的信息
    46.             content=await resp.json()  #读到的内容存储
    47.             #print(content)
    48.             result=obj3.finditer(content)
    49.             for it in result:
    50.                 #print(it.group('main'))
    51.                 book=it.group('main')
    52.                 async with aiofiles.open('4.8-book/'+name,mode='w',encoding='UTF-8') as f:  #保存文件,注意wb模式是不能使用encoding的
    53.                     await f.write(book)
    54.                 print('完成')


    55. if __name__=='__main__':
    56.     b_id='1030136856'
    57.     url='https://book.qidian.com/info/'+b_id+'/#Catalog'
    58.     #getintroduction(url,headers=headers)
    59.     asyncio.run(getintroduction(url,headers=headers))
    复制代码


    附件: 您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 1522 天

    连续签到: 1 天

    [LV.Master]测试大本营

    2#
    发表于 2021-10-15 10:46:57 | 只看该作者
    异步应该没有实时好用吧
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 997 天

    连续签到: 1 天

    [LV.10]测试总司令

    3#
    发表于 2021-10-15 15:15:55 | 只看该作者
    为啥要用异步
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 2819 天

    连续签到: 1 天

    [LV.Master]测试大本营

    4#
    发表于 2021-10-15 16:15:24 | 只看该作者
    异常抓取有问题
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 15:55 , Processed in 0.061559 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表