天天看点

python异步爬虫-批量爬取美女图片

异步爬虫练习项目,需要改进的地方请大神指点!感谢🙏

'''
使用异步抓取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())