鱼C论坛

 找回密码
 立即注册
查看: 3036|回复: 5

[技术交流] 异步协程爬妹子—效率真的提高了亿点点!

[复制链接]
发表于 2021-4-30 13:32:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
异步协程爬妹子,下载速度杠杠滴!内容我就不多说了,祝大伙身体健康
import requests
from lxml import etree
import os
import aiofiles
import aiohttp
import asyncio
import re
from bs4 import BeautifulSoup
import os.path

jpg = re.compile(r'https.*?jpg',re.S)
div = re.compile(r'div class=.*?div class="clear"',re.S)
#jpg = re.compile(r'div class="single-content".*?(?P<jpg>https.*{0,}jpg)div class="clear"',re.S)

async def dowload(url ):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            response = await resp.text()
            html = BeautifulSoup(response,"html.parser")
            div = html.find('div',class_="single-content")
            jp = div.find_all("p")
            for i in jp:
                img = i.find("img")
                jpg = img.get("src")
                name = jpg.split("/")[-2]+jpg.split("/")[-1]
                async with session.get(jpg) as res:
                    async with aiofiles.open(name,"wb")as f:
                        await f.write(await res.content.read())
                



def callback(future):
    print(future.result())


async def geturl():
    
    resp = requests.get(url)
    tree = etree.HTML(resp.text)
    lis = tree.xpath('//*[@id="main"]/article')
    tasks = []
    for li in lis:
        link = li.xpath('./div/figure/span/a/@href')[0]
        name = li.xpath('./div/figure/span/a/img/@alt')[0]
        #拿到所有的url 开始准备异步任务
        task = asyncio.create_task(dowload(link))
        task.add_done_callback(callback)
        tasks.append(task)

    await asyncio.wait(tasks)


if __name__ == '__main__':

    
    y_url = "http://www.liangtulaile.com"
    dic = {"性感": "/xinggan/", "尤物": "/youwu/", "制服": "/zhifu/", "丝袜": "/siwa/",
       "清纯": "/qingchun/", "Cosplay": "/cosplay/"}
    while True:
        print("输入“q” 退出")
        guss = input("你想下载的类型(性感 尤物 制服 丝袜 清纯 Cosplay):")
                    
        if guss == 'q':
            break
        else:
            
            namber = input("你想下载第几页:")
            print("开始下载,请稍等...")
            name = dic[guss]
            url = y_url + name + 'page/' + namber
            
            dir_name = guss + namber
            if os.path.exists(dir_name):
                os.chdir(dir_name)
            else:   
                os.mkdir(dir_name)
                os.chdir(dir_name)
                
            loop=asyncio.get_event_loop()
            loop.run_until_complete(geturl())
    print("感谢使用!!")
555337.jpg
555338.jpg
QQ图片20210430132237.png
QQ图片20210430132247.png

把后缀名改成py就能用.zip

2.57 KB, 下载次数: 24

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-30 15:26:27 | 显示全部楼层
本帖最后由 °蓝鲤歌蓝 于 2021-4-30 15:28 编辑

没有完全异步。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 22:13:14 | 显示全部楼层

刚学异步,有哪里需要改进的麻烦帮我标一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-30 23:02:38 | 显示全部楼层
1.
resp = requests.get(url)

python里异步是“一处异步,处处异步”,这里的 requests 本身不是异步的,所以在这里会阻塞。

2. while 循环里不是异步的,是依次把用户输入的 gues 对应的 url 传入到 getUrl 里的。

3. 真正异步的地方只有 taks 里的 url[/b], 还是分批异步的。打个比方,你有5个车间(dic),每个车间里各有 20 条生产线(tasks),你这程序就相当于先运行了 a车间 的 20 条线(异步运行),等 a 车间完成后再去 b 车间,依次 c, d, e。 所以还是有阻塞。真正的异步应该是 5 个车间所有的 生100条 生产线一起运行(异步执行)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-1 14:17:15 | 显示全部楼层
感谢提醒
下次再加上去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-22 21:10:28 | 显示全部楼层
协程中怎么加上异常处理呢!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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