查看: 1501|回复: 3

一个高速爬取小姐姐写真照的异步爬虫

[复制链接]
发表于 2022-9-20 10:17 | 显示全部楼层 |阅读模式
非法程序、 2022-9-20 10:17 1501 3 显示全部楼层
注意:此版本只能搜索下载,并且输入关键字后会立刻下载所有下载结果,可以先在网站上确定自己要下载的资源再输入,或者自己修改代码,这个网站没有反爬虫设置,还是很简单的。

演示:

Peek-2022-09-19-21-30.gif
爬虫代码:
  1. import aiofiles
  2. import aiohttp
  3. import asyncio
  4. from lxml import etree
  5. import uvloop    # win下忽略,不要导入此模块
  6. import os

  7. asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())    # win下注释掉此行
  8. headers={"User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0"}

  9. async def get_url(session,url):
  10.     async with session.get(url,headers=headers) as resp:
  11.         if resp.status==200:
  12.             res = await resp.text()
  13.             return res


  14. async def htmlParsh(sem,session,html):
  15.     async with sem:
  16.         htmlPs = etree.HTML(html)
  17.         chaUrls = htmlPs.xpath('//a[@class="item-link"]/@href')
  18.         tasks = []
  19.         for url in chaUrls:
  20.             task = asyncio.create_task(imgParse(session,url))
  21.             tasks.append(task)
  22.         nextPageUrl = htmlPs.xpath('//li[@class="page-item"]/a[@rel="next"]/@href')
  23.         if not nextPageUrl:
  24.             await asyncio.wait(tasks)
  25.             print("所有页面索引完毕!")   
  26.             return      
  27.         else:
  28.             await main(nextPageUrl[0])

  29. async def imgParse(session,url):
  30.     imgHtml = await get_url(session,url)
  31.     htmlPs = etree.HTML(imgHtml)
  32.     iTitle = htmlPs.xpath('//h1[@class="post-title"]/text()')[0]
  33.     imgUrls = htmlPs.xpath('//div[@data-fancybox="gallery"]/img/@data-src')
  34.     tasks=[]
  35.     for url in imgUrls:
  36.         urlSplit = url.split("/")
  37.         imgName = urlSplit[-1]
  38.         imgContent = await getImg(session,url)
  39.         task = asyncio.create_task(writeImg(iTitle,imgName,imgContent),name=f'{iTitle}-{imgName}')
  40.         tasks.append(task)
  41.     await asyncio.wait(tasks)


  42. async def writeImg(ititle,imgname,imgcontent):
  43.     downloadPath ="/home/yin/download/pyspider"
  44.     if not os.path.exists(downloadPath + '/' + keyword + '/' + ititle):
  45.         os.makedirs(downloadPath + '/' + keyword + '/' + ititle)
  46.         async with aiofiles.open(downloadPath + '/' + keyword + '/' + ititle + '/' + imgname, 'wb') as f:
  47.             print('正在下载:' + ititle + '/' + imgname)
  48.             await f.write(imgcontent)
  49.     else:
  50.         if os.path.exists(downloadPath + '/' + keyword + '/' + ititle + '/' + imgname):
  51.             print(f'{imgname}已存在,忽略下载!!!')
  52.         else:
  53.             async with aiofiles.open(downloadPath + '/' + keyword + '/' + ititle + '/' + imgname, 'wb') as f:
  54.                 print('正在下载:' + ititle + '/' + imgname)
  55.                 await f.write(imgcontent)


  56. async def getImg(session,imgurl):
  57.     async with session.get(imgurl,headers=headers) as resp:
  58.         if resp.status == 200:
  59.             imgContent = await resp.read()
  60.             return imgContent




  61. async def main(offset):
  62.     sem = asyncio.Semaphore(5)
  63.     async with aiohttp.ClientSession() as session:
  64.         html = await get_url(session,offset)
  65.         await htmlParsh(sem,session,html)


  66. keyword = input("请输入要搜索的关键字:")
  67. offset=f'https://www.f4mn.com/search.html?s={keyword}'
  68. asyncio.run(main(offset))
复制代码


发表于 2022-9-20 11:06 | 显示全部楼层
yunrui660 2022-9-20 11:06 显示全部楼层
感谢楼主,好人一生平安
回复

使用道具 举报

发表于 2022-9-20 21:44 | 显示全部楼层
w495557292 2022-9-20 21:44 显示全部楼层
感谢楼主,好人一生平安
回复

使用道具 举报

发表于 2022-9-20 21:45 | 显示全部楼层
w495557292 2022-9-20 21:45 显示全部楼层
药不能停 / 加大药量
回复

使用道具 举报

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

本版积分规则 返回列表 发新帖

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