1589895304 发表于 2021-4-30 13:32:34

异步协程爬妹子—效率真的提高了亿点点!

异步协程爬妹子,下载速度杠杠滴!内容我就不多说了{:5_109:},祝大伙身体健康

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')
      name = li.xpath('./div/figure/span/a/img/@alt')
      #拿到所有的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
            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("感谢使用!!")

°蓝鲤歌蓝 发表于 2021-4-30 15:26:27

本帖最后由 °蓝鲤歌蓝 于 2021-4-30 15:28 编辑

没有完全异步。

1589895304 发表于 2021-4-30 22:13:14

°蓝鲤歌蓝 发表于 2021-4-30 15:26
没有完全异步。

{:5_109:}刚学异步,有哪里需要改进的麻烦帮我标一下

°蓝鲤歌蓝 发表于 2021-4-30 23:02:38

1. resp = requests.get(url)
python里异步是“一处异步,处处异步”,这里的 requests 本身不是异步的,所以在这里会阻塞。

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

3. 真正异步的地方只有 taks 里的 url, 还是分批异步的。打个比方,你有5个车间(dic),每个车间里各有 20 条生产线(tasks),你这程序就相当于先运行了 a车间 的 20 条线(异步运行),等 a 车间完成后再去 b 车间,依次 c, d, e。 所以还是有阻塞。真正的异步应该是 5 个车间所有的 生100条 生产线一起运行(异步执行)。

1589895304 发表于 2021-5-1 14:17:15

感谢提醒{:5_92:}
下次再加上去

一坨屎吖 发表于 2021-8-22 21:10:28

协程中怎么加上异常处理呢!!!!
页: [1]
查看完整版本: 异步协程爬妹子—效率真的提高了亿点点!