鱼C论坛

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

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

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

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

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

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

  1. import requests
  2. from lxml import etree
  3. import os
  4. import aiofiles
  5. import aiohttp
  6. import asyncio
  7. import re
  8. from bs4 import BeautifulSoup
  9. import os.path

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

  13. async def dowload(url ):
  14.     async with aiohttp.ClientSession() as session:
  15.         async with session.get(url) as resp:
  16.             response = await resp.text()
  17.             html = BeautifulSoup(response,"html.parser")
  18.             div = html.find('div',class_="single-content")
  19.             jp = div.find_all("p")
  20.             for i in jp:
  21.                 img = i.find("img")
  22.                 jpg = img.get("src")
  23.                 name = jpg.split("/")[-2]+jpg.split("/")[-1]
  24.                 async with session.get(jpg) as res:
  25.                     async with aiofiles.open(name,"wb")as f:
  26.                         await f.write(await res.content.read())
  27.                



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


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

  43.     await asyncio.wait(tasks)


  44. if __name__ == '__main__':

  45.    
  46.     y_url = "http://www.liangtulaile.com"
  47.     dic = {"性感": "/xinggan/", "尤物": "/youwu/", "制服": "/zhifu/", "丝袜": "/siwa/",
  48.        "清纯": "/qingchun/", "Cosplay": "/cosplay/"}
  49.     while True:
  50.         print("输入“q” 退出")
  51.         guss = input("你想下载的类型(性感 尤物 制服 丝袜 清纯 Cosplay):")
  52.                     
  53.         if guss == 'q':
  54.             break
  55.         else:
  56.             
  57.             namber = input("你想下载第几页:")
  58.             print("开始下载,请稍等...")
  59.             name = dic[guss]
  60.             url = y_url + name + 'page/' + namber
  61.             
  62.             dir_name = guss + namber
  63.             if os.path.exists(dir_name):
  64.                 os.chdir(dir_name)
  65.             else:   
  66.                 os.mkdir(dir_name)
  67.                 os.chdir(dir_name)
  68.                
  69.             loop=asyncio.get_event_loop()
  70.             loop.run_until_complete(geturl())
  71.     print("感谢使用!!")
复制代码
555337.jpg
555338.jpg
QQ图片20210430132237.png
QQ图片20210430132247.png

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

2.57 KB, 下载次数: 24

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

没有完全异步。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

刚学异步,有哪里需要改进的麻烦帮我标一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-30 23:02:38 | 显示全部楼层
1.
  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条 生产线一起运行(异步执行)。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-1 14:17:15 | 显示全部楼层
感谢提醒
下次再加上去
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-22 21:10:28 | 显示全部楼层
协程中怎么加上异常处理呢!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 16:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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