Python在爬虫中的应用实例(百度图片批量下载)

写在前面:
爱因斯坦说过:一个人的价值,应该看他付出了什么,而不是看他获得了什么。

工具 :我使用的是 python3 ,另外还需要一个打包工具pyinstaller(将代码打包成exe文件可以移植到任意pc端运行)

软件截图

在这里插入图片描述
在这里插入图片描述

整个软件的完整代码如下(可以直接运行)

# Edison于2020.2.27日完成
# 开发环境 python 3.7.6
# 版本:V20200227203007.2
from tkinter import *
import random
import urllib.request
import re
import os
import urllib
import urllib.parse
import requests
import tkinter.messagebox
from tkinter.filedialog import askdirectory
from tkinter import filedialog

##以上库全是本项目所需,可能有个别是重复的库
myWindow = Tk()                 #创建一个窗口
myWindow.title('宇宙最骚爬虫')  #设置标题
myWindow['background'] = 'gray' #设置背景为黑色的

myWindow.geometry('380x128')    #设置窗口大小
myWindow.resizable(0,0)         #窗口大小不可调节

menubar = Menu(myWindow)       #创建菜单栏 

myWindow['menu']=menubar      #菜单栏添加到窗口

def open_dir():              #调用该函数打开目录实现
    #path_open =askdirectory()
    #path.set(path_open)
    path_open=filedialog.askopenfilename()#库函数调用
    #path.set(path_open)
    print(path_open)
        
##菜单栏添加函数        
menubar.add_command(label='打开文件夹',command=open_dir)
def call_auth():
     print(tkinter.messagebox.showwarning(title='提示',message='本软件纯属个人练手用\n不涉及商业利益\n本人主要从事c++开发\npython纯属业余\n不喜勿喷!'))
menubar.add_command(label='联系作者',command=call_auth)
def show_info():
    print(tkinter.messagebox.showinfo(title='关于',message='名称:宇宙最骚爬虫\n作者:Edison\n交付日期:2020年2月27日20点07分\n版本信息:V202002272007.2'))


menubar.add_command(label='关于',command=show_info)

#软件中几个输入窗口创建
Label(myWindow, text='输入关键字:', relief=RIDGE, width=15).grid(row=0, column=0)
Label(myWindow, text='限制尺寸大小(kb)', relief=RIDGE, width=15).grid(row=1, column=0)
Label(myWindow, text='保存位置', relief=RIDGE, width=15).grid(row=2, column=0)

entryVar1 = StringVar() #库函数调用传值
entry1 = Entry(myWindow, textvariable=entryVar1, width=40) #创建输入框对象 并指定宽度
entry1.grid(row=0, column=1) #采用网格布局 

entryVar2 = StringVar()
entry2 = Entry(myWindow, textvariable=entryVar2, width=40)
entry2.grid(row=1, column=1)

text_result = Text(myWindow, width=40, height=2)
text_result.grid(row=4, column=1)

entryVar3 = StringVar()
entry3 = Entry(myWindow, textvariable=entryVar3, width=40)
entry3.grid(row=2, column=1)
entryVar3.set('F://GetPicture//') #设置图片的保存根目录可以手动修改

url1='http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word='#这个路径很关键 打开百度图片就是这个网址
def getHtml():#自定义函数 用来获取网页对象(就是白天跟你讲的网页代码那一长很乱的字符串)
    r = requests.get(url1)#掉用requests库里面的get()函数获取网页对象
    ret =r.text #转换成字符串
    return ret

def getImg(ret): #获取并保存图片函数
    result = re.findall('"objURL":"(.*?)",',ret)#这个匹配是匹配到每个图片的地址
    
    m_path = str(entryVar3.get()) + str(entryVar1.get()) #图片文件夹目录(每次搜索放在关键字对应的目录下)
    if not os.path.isdir(m_path): # 判断如果目录不存在需要创建
        os.makedirs(m_path)
    m_path = m_path +'//'#绝对路径
    for i in result:#从获取的图片地址列表中遍历文件
        try:
         r=requests.get(i,timeout=5)#5秒超时,5秒解析有故障将打印异常,并且跳过目标图片
        except Exception as e:
            print(e)
            continue
        path = i[-10:] #取图片地址后10位作为图片的名字
        end =re.search(r'\.jpg$|\.jpeg$|\.gif$|\.png$',path) #获取所有格式的文件(这个匹配方式暂时不要问)
        if end == None:
            path = path + '.jpg'#图片文件的ID
            path =re.sub('/',' ',path)#将斜杆换成空格
        with open(m_path + path,'wb') as f: #打开文件 
              f.write(r.content)   # 写到文件
              size = os.path.getsize(m_path + path)#获取文件大小
              size=size/float(1024)
        if size > int(entryVar2.get()):#判断图片尺寸是否大于输入的值
          os.remove(m_path + path)#如果是,将移除图片
def hitMe():
    
    print(str(entryVar1.get()))
    global url1
    url1=url1+ str(entryVar1.get())#这个是本来的网址加你输入的关键字构成新的网址
    
    html =getHtml()
    (getImg(html))
    m_result = str(entryVar1.get()) + ' 本次相关数据爬取完成'
    text_result.insert(1.0, m_result + '\n')
    url1 ='http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word='#这里记得一定要还原,保证关键不会叠加
button1 = Button(myWindow, text='开始爬取', width=14, command=hitMe)#创建按钮 并绑定事件
button1.grid(row=3, column=0)
def hitClear():
    entryVar1.set('') #清除输入框的内容
    entryVar2.set('')
button2 = Button(myWindow, text='重新搜索其他资源', width=14, command=hitClear)
button2.grid(row=3, column=1)
def hitClearText():
    text_result.delete(1.0, END)
button3 = Button(myWindow, text='清除爬取记录', width=14, command=hitClearText)
button3.grid(row=4, column=0)
mainloop()

补充

打包工具 pyinstaller 介绍:
1.为什么要打包:有些高端的软件里面涉及一些自己的成果不愿意让别人看到(比如位设计一个很牛逼的算法,但我并不想让你知道)
2.打包后的软件会将相关的依赖文件集成在一起,可以在任意其他相应设备上运行

pyinstaller 打包相关命令:

命令详情
-i指定打包后只生成一个exe格式的文件
-F指定打包后只生成一个exe格式的文件
-D–onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
-c–console, –nowindowed 使用控制台,无界面(默认)
-w–windowed, –noconsole 使用窗口,无控制台
-p添加搜索路径

谢谢浏览,希望日后多多交流

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值