鱼C论坛

 找回密码
 立即注册
查看: 1408|回复: 0

[技术交流] 爬mm图片

[复制链接]
发表于 2018-6-9 11:29:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 chenxz186 于 2018-6-14 07:05 编辑

            很久没发过帖了,今日要发的帖是爬虫,本人在玩爬虫时对美女的图片特别热衷,所以今天的帖以美女为主题。这里用到的模块是requests, re, os, bs4,发布两个程序,第一个程序以requests, re, os爬取,另一个程序是以requests,bs4, os爬取,两者爬取内容是一样的,主要为了说明不懂得re正则表达式的朋友,不要怕,还可以用bs4的一些功能替代,好了,废话不多说,上代码吧。

第一个程序是以requests, re, os爬取:
  1. import requests
  2. import re
  3. import os


  4. def string_split_join(img):
  5.     '''对每张图片的进行去除斜杠处理'''
  6.     img_split = (img.split('/uploads/')[1]).split('/', 3)
  7.     img_join = '-'.join(img_split)
  8.     return img_join


  9. def url_open(url):
  10.     '''将每个url用requests模块打开获取响应'''
  11.     headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
  12.                              'Chrome/63.0.3239.132 Safari/537.36 QIHU 360EE'}
  13.     res = requests.get(url, headers=headers)
  14.     res.encoding = 'gbk'
  15.     return res


  16. def file_func(folder='MM'):
  17.     '''生成文件夹'''
  18.     os.mkdir(folder)
  19.     os.chdir(folder)
  20.     file = os.getcwd()
  21.     return file


  22. def main():
  23.     # 在http://www.meizitu.com网站中在一定范围内筛选图片,那么就来一个大循环a/1.html到a/6000.html之间
  24.     min_wide = int(input('请输入你想爬到的范围最小值:'))
  25.     max_wide = int(input('请输入你想爬到的范围最高值:'))
  26.     # 生成文件夹
  27.     file = file_func()
  28.     filename = file
  29.     while min_wide <= max_wide:
  30.         url = 'http://www.meizitu.com/a/%s.html' % str(min_wide)
  31.         res = url_open(url)

  32.         p = r'src="([^"]+\.jpg)"'
  33.         img_addrs = re.findall(p, res.text)

  34.         print(filename)
  35.         for each in img_addrs:
  36.             if '/uploads/' in each:
  37.                 res_img = url_open(each)
  38.                 filename += '/' + string_split_join(each)
  39.                 with open(filename, 'wb') as f:
  40.                     f.write(res_img.content)
  41.             filename = file

  42.         min_wide += 1


  43. if __name__ == '__main__':
  44.     main()
复制代码



第二个程序是以requests, bs4, os爬取:

  1. import requests
  2. import bs4
  3. import os


  4. def download_img(soup, file):
  5.     """查找图片,并下载下来"""
  6.     filename = file
  7.     img_tag = soup.find_all('img')
  8.     for each in img_tag:
  9.         if 'limg.jpg' not in each['src'] and 'erweima.jpg' not in each['src']:
  10.             each_url = each['src']
  11.             res_img = open_url(each_url)
  12.             filename += '/' + string_split_join(each_url)
  13.             with open(filename, 'wb') as f:
  14.                 f.write(res_img.content)
  15.         filename = file


  16. def string_split_join(img):
  17.     """对每张图片的进行去除斜杠处理"""
  18.     img_split = (img.split('/uploads/')[1]).split('/', 3)
  19.     img_join = '-'.join(img_split)
  20.     return img_join


  21. def cooking_soup(res):
  22.     """将响应的网页用bs4内的BeautifulSoup渲染一趟,我在此将函数命名为cooking_soup,意为煮汤,哈哈"""
  23.     soup = bs4.BeautifulSoup(res.text, 'html.parser')
  24.     return soup


  25. def open_url(url):
  26.     """将每个url用requests模块打开获取响应"""
  27.     headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
  28.                              'Chrome/63.0.3239.132 Safari/537.36 QIHU 360EE'}
  29.     res = requests.get(url, headers=headers)
  30.     res.encoding = 'gbk'
  31.     return res


  32. def file_func(folder='MM'):
  33.     """生成文件夹"""
  34.     os.mkdir(folder)
  35.     os.chdir(folder)
  36.     file = os.getcwd()
  37.     return file


  38. def main():
  39.     # 在http://www.meizitu.com网站中在一定范围内筛选图片,那么就来一个大循环a/1.html到a/6000.html之间
  40.     min_wide = int(input('请输入你想爬到的范围最小值:'))
  41.     max_wide = int(input('请输入你想爬到的范围最高值:'))
  42.     file = file_func()
  43.     while min_wide <= max_wide:
  44.         url = 'http://www.meizitu.com/a/%s.html' % str(min_wide)
  45.         res = open_url(url)
  46.         if res.status_code == 200:
  47.             soup = cooking_soup(res)
  48.             download_img(soup, file)
  49.         else:
  50.             print('%s不能正常响应,或许不存在此网' % url)
  51.         min_wide += 1


  52. if __name__ == '__main__':
  53.     main()
复制代码



        这两个程序的目的是一样的,就是代码改变了一下以及用的模块有些不同,不过两个程序,还可以再改善得更好些,我没有花精力在上面,毕竟小程序,随手编来玩玩而已,以后会发更多自己认为更完美的程序上来。如果我花精力改善以上两个程序,我又会沉入不断改程序的死循环的旧毛病中,在我内心深处一直认为自己编的任何程序总感觉不够完美,要不断改善,我曾试过将一个小小的金融期权保证金计算器修改了几十遍,竟然出现了20多个版本,其实任何一个版本都满足我的需求的,但就是觉得它不完美,达不到心中所需,在我心中,它们依然是次品。在此,希望观看过此文的朋友们会帮忙改善下,将你们不同的版本发在评论内,彼此交流学习下。

(代码除了上面显示的外,我也另打包放上去了,有兴趣的朋友下来看看,顺便帮忙改造下。)
       

代码.zip

2.3 KB, 下载次数: 4

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 21:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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