找回密码
  注册[Register]
查看: 1332|回复: 10

【python】妹子图网站图片爬虫

[复制链接]
发表于 2020-8-3 16:47 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

妹子图网站图片爬虫

不多说,直接上代码:

  1. import os
  2. import requests
  3. from lxml import etree
  4. import urllib


  5. class MZiTu:

  6.     # 初始化对象属性
  7.     def __init__(self):
  8.         a = eval(input("直接下载请按1、搜索下载请按2、性感类请按3、日本类请按4、台湾类请按5、清纯类请按6:"))
  9.         if a==1:
  10.             self.index_url = "https://www.mzitu.com/"
  11.         elif a==2:
  12.             search = input("请输入要搜索的名字:")
  13.             self.index_url = "https://www.mzitu.com/search/"+ urllib.parse.quote(search) + "/"
  14.         elif a==3:
  15.             self.index_url = "https://www.mzitu.com/xinggan/"
  16.         elif a==4:
  17.             self.index_url = "https://www.mzitu.com/japan/"
  18.         elif a==5:
  19.             self.index_url = "https://www.mzitu.com/taiwan/"
  20.         elif a==6:
  21.             self.index_url = "https://www.mzitu.com/mm/"
  22.         print(self.index_url)
  23.         self.headers = {
  24.             "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
  25.             "Referer": "https://www.mzitu.com/"
  26.         }
  27.         self.path = input('请输入保存的文件夹名:')

  28.     # 发送request请求
  29.     def send_request(self, url):
  30.         return requests.get(url, headers=self.headers,timeout=3).content

  31.     # 解析每页的数据
  32.     def parse(self, html_str):
  33.         html = etree.HTML(html_str)
  34.         titles = html.xpath('//img[@class="lazy"]')
  35.         content_list = []
  36.         for title in titles:
  37.             item = {}
  38.             item['title'] = title.xpath('./@alt')[0]
  39.             item['href'] = title.xpath('../@href')[0]
  40.             content_list.append(item)
  41.             # print(item)
  42.         # print(content_list)
  43.         next_url = html.xpath('//a[contains(text(),"下一页")]/@href')
  44.         next_url = next_url[0] if next_url else None
  45.         return content_list, next_url

  46.     # 获取每张写真集的img_url
  47.     def get_img_url(self, detail_html):
  48.         html = etree.HTML(detail_html)
  49.         img_url = html.xpath('//div[@class="main-image"]/p/a/img/@src')[0]
  50.         next_img_url = html.xpath('//span[contains(text(),"下一页")]/../@href')
  51.         next_url = next_img_url[0] if next_img_url else None
  52.         return img_url, next_url

  53.     # 判断文件夹是否存在,不存在创建文件夹
  54.     def mkdir(self, dir_name, img_url_list):
  55.         total_image = len(img_url_list)
  56.         meizi_dir = self.path if self.path else 'meizitu'
  57.         finall_dir = meizi_dir + '/' + '[{}P]'.format(str(total_image)) + dir_name
  58.         if os.path.isdir("F:\Python爬取\图片/"+finall_dir) != True:  # 如果保存的路径不存在
  59.             os.makedirs(r"F:\Python爬取\图片/"+finall_dir)  # 如果不存在。我们将创立这个路径
  60.         path = "F:\Python爬取\图片/"+finall_dir+"/"
  61.         return path

  62.     # 保存img
  63.     def save_image(self, j, final_dir, img_url_list):
  64.         for img_url in img_url_list:
  65.             try:
  66.                 image_data = self.send_request(img_url)
  67.             except:
  68.                 continue
  69.             file_name = final_dir + '/' + img_url[-9:]
  70.             with open(file_name, 'wb') as image:
  71.                 image.write(image_data)
  72.             print("*" * 14, img_url, '下载完成', "*" * 14)
  73.         print("-" * 29 + '第{}张写真集保存完毕'.format(int(j)) + "-" * 30 + '\n\n')

  74.     # 运行爬虫
  75.     def run(self):
  76.         # 1. 获取url
  77.         next_page_url = self.index_url
  78.         i = 1
  79.         # 获取每页的url地址并解析
  80.         while True:
  81.             # 2. 发送请求,获取响应
  82.             try:
  83.                 html_str = self.send_request(next_page_url).decode()
  84.             except:
  85.                 continue
  86.             # 3. 解析数据
  87.             content_list, next_page_url = self.parse(html_str)
  88.             # 4. 获取详情页的img
  89.             j = 1
  90.             # 获取每张写真集并解析
  91.             for content in content_list:
  92.                 img_url_list = []
  93.                 print("-" * 30 + '正在获取第{}张写真集'.format(int(j)) + "-" * 30)
  94.                 # 获取每张写真集的img_url
  95.                 # 第一页的img地址
  96.                 dir_name = content['title']
  97.                 next_url = content['href']
  98.                 # print(next_url)
  99.                 # 获取每张写真集每页的img_url
  100.                 while True:
  101.                     try:
  102.                         detail_html = self.send_request(next_url).decode()
  103.                     except:
  104.                         continue
  105.                     img_url, next_url = self.get_img_url(detail_html)
  106.                     # 第二页的img地址
  107.                     # detail_html = self.send_request(next_url)
  108.                     # img_url, next_url =self.get_img_url(detail_html)
  109.                     img_url_list.append(img_url)
  110.                     if next_url is None:
  111.                         break
  112.                 # 保存图片
  113.                 if img_url_list:
  114.                     final_dir = self.mkdir(dir_name, img_url_list)
  115.                     self.save_image(j, final_dir, img_url_list)
  116.                 j += 1
  117.             print("-" * 32 + '第{}页获取完成'.format(int(i)) + "-" * 32 + '\n\n')
  118.             i += 1
  119.             if next_page_url is None:
  120.                 break


  121. def main():
  122.     mz = MZiTu()
  123.     mz.run()


  124. if __name__ == '__main__':
  125.     main()
复制代码




想要下载哪种类型自己选择:"直接下载请按1、搜索下载请按2、性感类请按3、日本类请按4、台湾类请按5、清纯类请按6:"
131341e9cox6enbj3x66x5.png
我的存储地址为:F:\Python爬取\图片\,可以自己更改,存储文件夹可自己命名
最后郑重提醒:注意身体!!!!!!!!!!

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2020-8-3 16:53 | 显示全部楼层
谢谢大佬
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-8-3 17:02 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-8-3 17:13 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-8-3 17:32 | 显示全部楼层
goooooood
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2020-8-3 17:32 | 显示全部楼层
感谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-8-3 18:29 | 显示全部楼层
好的,非常感谢
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-8-3 21:20 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-8-4 00:31 | 显示全部楼层
6666666666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-8-4 10:13 | 显示全部楼层
怎么用
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|广告投放|大牛论坛

GMT+8, 2024-5-30 19:26 , Processed in 0.042201 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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