异步协程爬妹子—效率真的提高了亿点点!
异步协程爬妹子,下载速度杠杠滴!内容我就不多说了{: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:28 编辑
没有完全异步。 °蓝鲤歌蓝 发表于 2021-4-30 15:26
没有完全异步。
{:5_109:}刚学异步,有哪里需要改进的麻烦帮我标一下 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条 生产线一起运行(异步执行)。 感谢提醒{:5_92:}
下次再加上去 协程中怎么加上异常处理呢!!!!
页:
[1]