代码1
#/usr/bin/env python #coding:utf-8 import json import urllib.request import threading #导入需要的JSON ,urllib及threading #定义一个类 class myThread(threading.Thread): def __init__(self,imgurl,filename): threading.Thread.__init__(self) self.imgurl = imgurl self.filename = filename def run(self): print ('downloading: ' + self.imgurl) downfile(self.imgurl,self.filename) #定义一个下载程序 def downfile(imgurl , filename): img_req = urllib.request.Request(imgurl) opener = urllib.request.build_opener() img_resp = opener.open(img_req) try: out = open(filename,'wb') out.write(img_resp.read()) out.flush() out.close() except: print('error') if __name__ == "__main__": surl = 'http://huaban.com/pins/1821121555/?jlb0k0ki' #需要爬取的花瓣网美女图片地址 hb = urllib.request.Request(surl) #按XHLHttprequest方式请求 hb.add_header('X-Requested-With','XMLHttpRequest' ) #模拟win10 chrome 浏览器 hb.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0') html = urllib.request.urlopen(hb).read() obj = json.loads( html ) #print (obj['pin']['board']['pins']) imgs = obj['pin']['board']['pins'] #花瓣网图片需要的网址头 preurl = 'http://img.hb.aicdn.com/' for img in imgs : imgurl = preurl + img['file']['key'] #print (imgurl) myThread(imgurl,img['file']['key'] + '.jpg').start()
代码2
import urllib.request import re import os import datetime import easygui # 获取网页 def get_html(url): page = urllib.request.urlopen(url) html = page.read().decode('utf-8') #需要解码 return html # 下载图片 def get_image(path,html): # 获取HTML源码里面的app.page["pins"]部分,主要图片ID位于此部分 get_app_page_pins = re.compile(r'app\.page\["pins"\].*?;', re.S) get_str = re.findall(get_app_page_pins, html)[0] pin_id = r'"pin_id":(\d+)' pin_id_re = re.compile(pin_id) # 获取图片ID,保存在列表中 id_list = re.findall(pin_id_re,get_str) x = 0 for pinId in id_list: # 获取跳转网页网址 url_str = r'http://huaban.com/pins/%s/' % pinId # 获取点击图片时弹出网页的源码 pinId_source = get_html(url_str) # 解析源码,获取原图片的网址 img_url_re = re.compile('main-image.*?src="(.*?)"', re.S) img_url_list = re.findall(img_url_re, pinId_source) try: img_url = 'http:' + img_url_list[0] urllib.request.urlretrieve(img_url, path + '\%s.jpg' % x) except: print("获取图片:%s失败,跳过,获取下一张。" % img_url) continue print("获取成功!%s" % img_url) x += 1 print("保存图片成功!") # 创建文件夹路径 def createPath(): while True: print('选择你要保存的路径') path = easygui.diropenbox() filePath = path + "\\" + str(datetime.datetime.now().strftime('%Y-%m-%d %H.%M.%S')) isExists = os.path.exists(filePath) if not isExists: # 创建目录 os.makedirs(filePath) print('%s创建成功!' % filePath) break else: print('%s已存在重新输入!' % filePath) return filePath if __name__ == '__main__': html = get_html("http://huaban.com/favorite/beauty/") get_image(createPath(), html) #调用创建文件夹方法并返回文件夹路径和传入网址
代码3
#-*- coding:utf-8 -*- import requests import re import json # 导入 requests re正则 json ''' login 登录花瓣 获取session ''' def login(): login_url = 'https://huaban.com/auth/' # 登录地址 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0", "Accept": "application / json", "Content-type": "application/x-www-form-urlencoded; charset=utf-8", "Referer": "https://huaban.com/", } # 请求头信息 session = requests.session() #sesson 会话 login_data = { "email": "zengmumu%40126.com", "password": "zmm123", "_ref":"frame" } response = session.post(login_url, data=login_data, headers=headers,verify=False) # 登录页面 getPic(session,5) # 获取图片,前5页 ''' getPic 解析页面中的图片地址 session 会话信息 num 最大是页数 ''' def getPic(session,num): for i in range(1,num+1): response = session.get("https://huaban.com/search/?q=%E5%A5%B3%E7%A5%9E&category=photography&page="+str(i)) # 获取页面信息("美女"文字编码后的结果是"%E5%A5%B3%E7%A5%9E" ) data = re.search('app\.page\[\"pins\"\] =(.*);\napp.page\[\"page\"\]', response.text, re.M | re.I | re.S) # 提取到当前页面所在的所有图片信息 data = json.loads(data.group(1)) # 转换字符串为列表 for item in data: url = "https://hbimg.huabanimg.com/" + item["file"]["key"] # 拼接图片地址 index = item["file"]["type"].rfind("/") type = "."+item["file"]["type"][index + 1:] # 获取图片的类型 file_name = item["raw_text"] # 获取图片的中文名 download_img(url, file_name,type) # 下载图片 ''' 下载图片 url 图片的地址 name 图片的中文名 type 图片的类型 ''' def download_img(url,name,type): response = requests.get(url,verify=False) # 使用requests 下载图片 index = url.rfind('/') file_name = name+url[index + 1:]+type # 获取图片的hash值 print("下载图片:" + file_name) # 打印图片名称 save_name = "./photo/" + file_name # 图片保存的地址(注意photo要自己建一个,与当前.py文件同一个文件夹) with open(save_name, "wb") as f: f.write(response.content) # 写入图片到本地 ''' 定义主函数 ''' def main(): login() # 如果到模块的名字是__main__ 执行main主函数 if __name__ == '__main__': main()
效果