|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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'还是其他?是解码的意思吗?我不是很理解,谢谢!
喜欢的话请帮忙贴下评论、评分、点赞,谢谢!
- import urllib.request
- import os
- import re
- import time
- import random
- def url_open(url):
- req = urllib.request.Request(url)#创建POST请求
- req.add_header('User-Agent', "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/\
- 537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36")#修改请求头,模拟浏览器访问网页,否则html可能为[]
- response = urllib.request.urlopen(req).read()#读取网页源码
- return response
- # 另一种方法打开网页
- '''
- def url_open(url):
- req = urllib.request.Request(url)
- header = ('User-Agent', "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/\
- 537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
- )
- # 创建opner对象
- opener = urllib.request.build_opener()
- # 给该对象添加请求头
- opener.addheaders = [header]
- # 用open方法打开网页
- response = opener.open(url).read()
- return response
- '''
- def find_imgs(url):
- html = url_open(url).decode('gbk')# 网页编码是GBK,就换成gbk。否则为utf-8,这里不是很理解,请大佬指导一下什么时候该用gbk什么时候该用utf-8或其他
- #查看网页源码找到charest即可知道解码用什么编码,例如鱼C:<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
- p = r'" src="([^"]+\.jpg)"' #正则表达式抓取需要图片网页,可以尝试修改此处
- img_addrs = re.findall(p, html)
- #print (img_addrs)#可以尝试看一下re.findall是什么效果
- return img_addrs
- def download_mm(folder='OOXXplus'):#原先每次重新开车需要删除同名文件夹哟,这里用了try里解决
- try:
- os.mkdir(folder)
- except:
- print('文件夹已存在')
- folder1 = folder+str(random.randint(0,100000))
- os.mkdir(folder1)
- os.chdir(folder1)#随机创建文件夹,取100000随机重复的几率极小
- else:
- os.chdir(folder)
- #以下内容都是访问妹子图的特定规律网页,可以尝试修改爬取不同类型的图片,用你自己想到的方式
- page_num = 4506 # 取3600到5580
- x = 0 # 自命名图片
-
- img_addrs = [] # 防止图片重复
- # 只爬取前两页的图片,可改,同时给图片重命名
- while page_num <= 4510:# 取3600到5580跨度最好不要超过50,速度比较慢,可以去洗个澡
- try:
- page_url = url + 'a//' + str(page_num) + '.html' #妹子图的特定网址可以修改此处选择不同类型爱好,比如a//改为a/fuli_(相应的网页page_num也需要修改了,看个人能否理解并做些尝试)
- addrs = find_imgs(page_url)
- print(len(addrs))
- # img_addrs = []
- for i in addrs:
- if i in img_addrs:
- continue
- else:
- img_addrs.append(i)
- print(len(img_addrs))#图片链接列表汇总长度
- for each in img_addrs:
- print(each)
- page_num += 1
- time.sleep(2) #设置延时提交请求,以免被服务器禁止ip,防止妹子图网的程序猿震怒设置防爬
- # x = (len(2img_addrs)+1)*(page_num-1)
- except:
- print('中途碰到错误1,放弃后续任务!找不到网页,请修改搜索页面范围!')
- continue
- for each in img_addrs:
- try:
- filename = str(x) + '.' + each.split('.')[-1]#为保存图片命名
- x += 1
- with open(filename, 'wb') as f:
- img = url_open(each)
- f.write(img)#保存图片
- except:
- x -= 1#可以尝试删除这里看看会有什么结果,我想这就是优化程序提高服务吧,大家还可以想想怎么把那张微信二维码去掉不保存
- print('中途碰到错误2,放弃后续任务!其中第%d图片报错HTTP:404请求的资源在服务器上找不到' % x)
- continue
- # page_num += 1
- if __name__ == '__main__':
- url = 'http://www.meizitu.com/'
- download_mm()
- print('滴滴')
复制代码 |
评分
-
查看全部评分
|