【Python爬虫】花瓣网爬取美女图片

代码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"] =(.*);
app.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()

效果

原文地址:https://www.cnblogs.com/HGNET/p/13975414.html