鱼C论坛

 找回密码
 立即注册
查看: 2908|回复: 18

[作品展示] Python小白从挖坑到脱坑之路005_关于爬取妹子图程序学习&注释

[复制链接]
发表于 2018-2-21 21:34:08 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 大头目 于 2018-9-20 16:29 编辑

声明以下程序是在论坛大佬“°蓝鲤歌蓝”分享的# urllib.request模块程序基础上修改,可以下载大图片。
本人研究了一晚上,加上了自己的理解注释、DIY解决了部分报错并增加报错提示。
欢迎各位大佬指正!

原技术贴传送门:http://bbs.fishc.com/forum.php?mod=viewthread&tid=102325&highlight=%C3%C3%D7%D3%CD%BC
顺便请教一个问题:html = url_open(url).decode('gbk')这段程序中什么时候用'gbk'什么时候用'utf-8'还是其他?是解码的意思吗?我不是很理解,谢谢!
喜欢的话请帮忙贴下评论、评分、点赞,谢谢!


  1. import urllib.request
  2. import os
  3. import re
  4. import time
  5. import random


  6. def url_open(url):
  7.     req = urllib.request.Request(url)#创建POST请求
  8.     req.add_header('User-Agent', "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/\
  9.                     537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36")#修改请求头,模拟浏览器访问网页,否则html可能为[]
  10.     response = urllib.request.urlopen(req).read()#读取网页源码
  11.     return response

  12. # 另一种方法打开网页
  13. '''
  14. def url_open(url):
  15.     req = urllib.request.Request(url)
  16.     header = ('User-Agent', "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/\
  17.                     537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
  18.     )
  19.     # 创建opner对象
  20.     opener = urllib.request.build_opener()
  21.     # 给该对象添加请求头
  22.     opener.addheaders = [header]
  23.     # 用open方法打开网页
  24.     response = opener.open(url).read()
  25.     return response
  26. '''

  27. def find_imgs(url):
  28.     html = url_open(url).decode('gbk')# 网页编码是GBK,就换成gbk。否则为utf-8,这里不是很理解,请大佬指导一下什么时候该用gbk什么时候该用utf-8或其他
  29.     #查看网页源码找到charest即可知道解码用什么编码,例如鱼C:<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
  30.     p = r'" src="([^"]+\.jpg)"' #正则表达式抓取需要图片网页,可以尝试修改此处

  31.     img_addrs = re.findall(p, html)
  32.     #print (img_addrs)#可以尝试看一下re.findall是什么效果
  33.     return img_addrs


  34. def download_mm(folder='OOXXplus'):#原先每次重新开车需要删除同名文件夹哟,这里用了try里解决
  35.     try:
  36.         os.mkdir(folder)
  37.     except:
  38.         print('文件夹已存在')
  39.         folder1 = folder+str(random.randint(0,100000))
  40.         os.mkdir(folder1)
  41.         os.chdir(folder1)#随机创建文件夹,取100000随机重复的几率极小
  42.     else:
  43.         os.chdir(folder)

  44. #以下内容都是访问妹子图的特定规律网页,可以尝试修改爬取不同类型的图片,用你自己想到的方式
  45.     page_num = 4506  # 取3600到5580
  46.     x = 0  # 自命名图片
  47.    
  48.     img_addrs = []  # 防止图片重复

  49.     # 只爬取前两页的图片,可改,同时给图片重命名
  50.     while page_num <= 4510:# 取3600到5580跨度最好不要超过50,速度比较慢,可以去洗个澡
  51.         try:
  52.             page_url = url + 'a//' + str(page_num) + '.html' #妹子图的特定网址可以修改此处选择不同类型爱好,比如a//改为a/fuli_(相应的网页page_num也需要修改了,看个人能否理解并做些尝试)
  53.             addrs = find_imgs(page_url)
  54.             print(len(addrs))
  55.             # img_addrs = []
  56.             for i in addrs:
  57.                 if i in img_addrs:
  58.                     continue
  59.                 else:
  60.                     img_addrs.append(i)
  61.             print(len(img_addrs))#图片链接列表汇总长度
  62.             for each in img_addrs:
  63.                 print(each)
  64.             page_num += 1
  65.             time.sleep(2) #设置延时提交请求,以免被服务器禁止ip,防止妹子图网的程序猿震怒设置防爬
  66.                         # x = (len(2img_addrs)+1)*(page_num-1)
  67.         except:
  68.             print('中途碰到错误1,放弃后续任务!找不到网页,请修改搜索页面范围!')
  69.             continue
  70.     for each in img_addrs:
  71.         try:
  72.             filename = str(x) + '.' + each.split('.')[-1]#为保存图片命名
  73.             x += 1
  74.             with open(filename, 'wb') as f:
  75.                 img = url_open(each)
  76.                 f.write(img)#保存图片
  77.         except:
  78.             x -= 1#可以尝试删除这里看看会有什么结果,我想这就是优化程序提高服务吧,大家还可以想想怎么把那张微信二维码去掉不保存
  79.             print('中途碰到错误2,放弃后续任务!其中第%d图片报错HTTP:404请求的资源在服务器上找不到' % x)
  80.             continue
  81.         # page_num += 1


  82. if __name__ == '__main__':
  83.      url = 'http://www.meizitu.com/'
  84.      download_mm()
  85.      print('滴滴')
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
MSK + 2 + 2 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

 楼主| 发表于 2018-2-22 09:47:26 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-22 13:08:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-22 20:54:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-22 23:27:35 | 显示全部楼层
顶顶顶顶顶顶顶顶顶顶顶顶顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-23 00:06:23 From FishC Mobile | 显示全部楼层
是什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-23 07:55:59 From FishC Mobile | 显示全部楼层
but4sky 发表于 2018-2-23 00:06
是什么呢?


没明白你什么意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-23 09:13:11 From FishC Mobile | 显示全部楼层
。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-23 10:19:12 From FishC Mobile | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-23 11:15:15 | 显示全部楼层
路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-23 16:59:11 | 显示全部楼层
本帖最后由 MSK 于 2018-2-23 17:00 编辑

支持

ps: 那个decode就是解码的意思, 至于什么时候用gbk什么时候用utf-8,这就取决于你所爬取的网站了,
比如鱼c论坛的网页编码就是gbk
而Baidu的编码是utf-8(被选中的那一行的charset属性)
截图1.png
解码时相应的改为utf-8就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-23 18:50:59 | 显示全部楼层
MSK 发表于 2018-2-23 16:59
支持

ps: 那个decode就是解码的意思, 至于什么时候用gbk什么时候用utf-8,这就取决于你所爬取 ...

感谢大佬指导!!!感觉自己距离老司机又进了一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-23 22:37:51 | 显示全部楼层
强烈推荐你,用requests模块编写,详细模块内容可以看小甲鱼的 极客python 里面的模块帮助,很好用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-23 22:46:37 | 显示全部楼层
snail:) 发表于 2018-2-23 22:37
强烈推荐你,用requests模块编写,详细模块内容可以看小甲鱼的 极客python 里面的模块帮助,很好用

好的,谢谢指点!刚入门爬虫,小甲鱼的书也没啃完,感觉有好多东西要学!但是学得很开心!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-23 23:09:23 | 显示全部楼层
大头目 发表于 2018-2-23 22:46
好的,谢谢指点!刚入门爬虫,小甲鱼的书也没啃完,感觉有好多东西要学!但是学得很开心!

爬虫那块,bs4挺有用,我现在看了几个小甲鱼最新的极客python发现urllib模块很鸡肋,requests完全可以更好的替代,可以节省很多代码量,也不容易弄错,总结了下爬虫主要的模块有requests、bs4、re
正则表达式好多,我也在学习
bs4梳理网页结构,爬取网页信息的,正则表达也一样
requests是网页请求和下载网页的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-20 16:54:58 | 显示全部楼层
爬下来的文件保存在哪里?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-21 16:55:15 | 显示全部楼层
想飞的翅膀 发表于 2018-5-20 16:54
爬下来的文件保存在哪里?

和程序在同一个文件夹里啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-21 17:31:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 10:48:31 | 显示全部楼层
刚才试了一下  把
else:
        os.chdir(folder)

#以下内容都是访问妹子图的特定规律网页,可以尝试修改爬取不同类型的图片,用你自己想到的方式
    page_num = 3600  # 取3600到5580
    x = 0  # 自命名图片
   
    img_addrs = []  # 防止图片重复
'''
  while page_num <= 3700:# 取3600到5580跨度最好不要超过50,速度比较慢,可以去洗个澡


这一行改成3700

过了半天文件夹没有新图片呀  一一直没有滴滴  是什么原因?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 20:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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