异步爬虫练习项目,需要改进的地方请大神指点!感谢🙏
'''
使用异步抓取umei.cc上的美女写真图片
'''
import asyncio #异步模块
import aiohttp #异步http模块
from lxml import etree
import time
#抓取的页数
END_PAG = 20
#美女写真类目页url
URL = "https://www.umei.cc/meinvtupian/meinvxiezhen/{}.htm"
#主函数
async def main():
tasks = []
#抓取的页数
for page in range(1,END_PAG+1):
#把异步函数放到tasks列表里
tasks.append(asyncio.create_task(get_html(URL.format(page),page)))
await asyncio.wait(tasks)
#获取类目页的html
async def get_html(url,page):
t1 = time.time()
print(f'开始抓取第【{page}】页图片!')
#创建session对象,类似于requests
async with aiohttp.ClientSession() as session:
#发送请求
async with session.get(url) as rsp:
#得到页面
html = await rsp.text()
#对页面进行解析
html = etree.HTML(html)
await downloads_img(html,session)
t2 = time.time()
print(f'第【{page}】页已抓取完毕!耗时间【%s】' %(t2-t1))
#从类目页url获取图片url并进行下载
async def downloads_img(html,session):
#匹配得到每页对img链接
img_lists = html.xpath('//div[@class="TypeList"]//li//img/@src')
#循环每个图片链接并进行下载
for i in img_lists:
#获取图片名称并添加路径
file_name = './meitu/' + i.rsplit('/', 1)[1]
#请求图片
async with session.get(i) as rsp:
#保存图片
with open(file_name,'wb') as f:
f.write(await rsp.content.read())
if __name__ == '__main__':
#启动
asyncio.run(main())