用requests可以访问而aiohttp不可以的情况怎么解决
用aiohttp异步协程获取网站信息时报错,而用request却正常是为什么的解决方案
记录一下这次学习异步协程的一个经历吧
本身已经学会了用aiohttp和asyncio模块来实现异步协程爬取网站m3u8视频资源且已经在一个网站上成功实现快速爬m3u8和ts并合并了,但是当我尝试在另一个需要代理的网站爬取时却出现了问题
一会是
一会是
然后我就在网上各种搜索,中间出现了iss错误,这让我很是难受,由于我爬取的这个网站它还有一个访问验证时效,m3u8下载地址还得一直改,不然失效了就会报错说又到处找说是浏览器设置还有网络设置啥的,我检查了都没有问题,后面又在ClientCession加入参数verity_ssl=False变成connector=aiohttp.TCPConnector(verify_ssl=False)后还是无果。
后来我想会不会是我用aiohttp协程的问题,然后我就写了个requests单线程尝试一下,结果居然成功了,那时候已经晚上了,搞了一下午,终于有了方向,然后我就去找requests和aiohttp的不同,有说是aiohttp会把输入的网址编码改变的,然后就给网址套了个URL,有说可能是同时建立的连接数太多了导致的,所以我给ClientCession里面加了个参数limit来限制同时建立的连接数,不过情况也没有改善。
直到最后到了晚上一点多实在要睡觉了,躺在床上用手机翻找解决方案时终于有结果了(很有意思,上次陷入困境也是这种情况下找到解决方法的),原来是aiohttp默认不使用全局代理,而requests是使用全局代理的,所以才出现requests可以下载但是aiohttp不可以下载的情况,解决方法如下:
给session.get()里加参数proxy='http://proxy(自己的代理,设置里找或者用下面给的函数找)'aiohttp只能用http代理不能用https代理,或者在aiohttp.ClientSession()里加加参数trust_env=True变成这样:aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=False,limit=25),trust_env=True)(verify_ssl=False现在需要改成ssl=False了)
,然后第二天起床我就尝试了这个方法,确实有效,可以成功下载了,但是还是会报错,然后下载的结果总是会有几个ts文件是空的,也就是数据没有获取到,
然后剩下的就是解决这个问题了,还有我比较了一下,发现在session.get()里加proxy参数下载的效率比在aiohttp.ClientSession里加trust_env=True的效率高很多,所以还是建议用前者,当然也可以两个都用
解决方法:上方标红处
问题:Server disconnected的问题是什么原因导致的,已经尝试过了不是同时存在的连接数过多或连接超时,还有我搜到aiohttp是只能支持http代理,不能直接支持https代理的,但是我用http代理可以直接访问https的网站,让我挺疑惑也挺惊喜的,但我还是想知道原因以及怎么在aiohttp异步协程里使用https代理
上文提到的获取本地代理的函数
参考的文章 :
这个里面就有解决问题的办法了,不过刚开始没看到细节处,后来才反应过来[笑哭]:
aiohttp使用代理ip访问https网站报错的问题_qq_43210211的博客-CSDN博客_aiohttp proxy
那天晚上手机看到的启发文:
python 异步框架aiohttp无法使用本地代理的解决方法_FOAF-lambda的博客-CSDN博客
aiohttp知识:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)