zoukankan      html  css  js  c++  java
  • 【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()

    效果

  • 相关阅读:
    检测ip是否ping通和ssh端口是否通
    python从excel取值
    后k8s时代-微服务
    nginx 笔记-01
    Linux中后台执行的方法nohup和screen
    为什么要自定义Java类加载器
    Synchronized实现原理
    一个线程两次或者多次调用start()方法会怎么样
    Java里锁的种类的总结
    Spring事务控制(PROPAGATION_NESTED)
  • 原文地址:https://www.cnblogs.com/HGNET/p/13975414.html
Copyright © 2011-2022 走看看