使用python做一个爬虫GUI程序

整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序

效果如下:

整体代码如下:

  1 # -*- coding:utf-8 -*-
  2
  3 import requests
  4 from requests.exceptions import RequestException
  5 import tkinter as tk
  6 from tkinter import ttk
  7 from bs4 import BeautifulSoup
  8 import bs4
  9 from tkinter import *
 10 from tkinter.filedialog import askdirectory
 11 import os
 12
 13 class DB():
 14     def __init__(self):
 15         self.window = tk.Tk()  #创建window窗口
 16         self.window.title("Crawler Pics")  # 定义窗口名称
 17         # self.window.resizable(0,0)  # 禁止调整窗口大小
 18         self.menu = ttk.Combobox(self.window,width=6)
 19         self.path = StringVar()
 20         self.lab1 = tk.Label(self.window, text = "目标路径:")
 21         self.lab2 = tk.Label(self.window, text="选择分类:")
 22         self.lab3 = tk.Label(self.window, text="爬取页数:")
 23         self.page = tk.Entry(self.window, width=5)
 24         self.input = tk.Entry(self.window, textvariable = self.path, width=80)  # 创建一个输入框,显示图片存放路径
 25         self.info = tk.Text(self.window, height=20)   # 创建一个文本展示框,并设置尺寸
 26
 27         self.menu[‘value‘] = (‘大胸妹‘,‘小翘臀‘, ‘黑丝袜‘, ‘美腿控‘, ‘有颜值‘,‘大杂烩‘)
 28         self.menu.current(0)
 29
 30         # 添加一个按钮,用于选择图片保存路径
 31         self.t_button = tk.Button(self.window, text=‘选择路径‘, relief=tk.RAISED, width=8, height=1, command=self.select_Path)
 32         # 添加一个按钮,用于触发爬取功能
 33         self.t_button1 = tk.Button(self.window, text=‘爬取‘, relief=tk.RAISED, width=8, height=1,command=self.download)
 34         # 添加一个按钮,用于触发清空输出框功能
 35         self.c_button2 = tk.Button(self.window, text=‘清空输出‘, relief=tk.RAISED,width=8, height=1, command=self.cle)
 36
 37     def gui_arrang(self):
 38         """完成页面元素布局,设置各部件的位置"""
 39         self.lab1.grid(row=0,column=0)
 40         self.lab2.grid(row=1, column=0)
 41         self.menu.grid(row=1, column=1,sticky=W)
 42         self.lab3.grid(row=2, column=0,padx=5,pady=5,sticky=tk.W)
 43         self.page.grid(row=2, column=1,sticky=W)
 44         self.input.grid(row=0,column=1)
 45         self.info.grid(row=3,rowspan=5,column=0,columnspan=3,padx=15,pady=15)
 46         self.t_button.grid(row=0,column=2,padx=5,pady=5,sticky=tk.W)
 47         self.t_button1.grid(row=1,column=2)
 48         self.c_button2.grid(row=0,column=3,padx=5,pady=5,sticky=tk.W)
 49
 50     def get_cid(self):
 51         category = {
 52             ‘DX‘: 2,
 53             ‘XQT‘: 6,
 54             ‘HSW‘: 7,
 55             ‘MTK‘: 3,
 56             ‘YYZ‘: 4,
 57             ‘DZH‘: 5
 58         }
 59         cid = None
 60         if self.menu.get() == "大胸妹":
 61             cid = category["DX"]
 62         elif self.menu.get() == "小翘臀":
 63             cid = category["XQT"]
 64         elif self.menu.get() == "黑丝袜":
 65             cid = category["HSW"]
 66         elif self.menu.get() == "美腿控":
 67             cid = category["MTK"]
 68         elif self.menu.get() == "有颜值":
 69             cid = category["YYZ"]
 70         elif self.menu.get() == "大杂烩":
 71             cid = category["DZH"]
 72         return cid
 73
 74     def select_Path(self):
 75         """选取本地路径"""
 76         path_ = askdirectory()
 77         self.path.set(path_)
 78
 79     def get_html(self, url, header=None):
 80         """请求初始url"""
 81         response = requests.get(url, headers=header)
 82         try:
 83             if response.status_code == 200:
 84                 # print(response.status_code)
 85                 # print(response.text)
 86                 return response.text
 87             return None
 88         except RequestException:
 89             print("请求失败")
 90             return None
 91
 92     def parse_html(self, html, list_data):
 93         """提取img的名称和图片url,并将名称和图片地址以字典形式返回"""
 94         soup = BeautifulSoup(html, ‘html.parser‘)
 95         img = soup.find_all(‘img‘)
 96         for t in img:
 97             if isinstance(t, bs4.element.Tag):
 98                 # print(t)
 99                 name = t.get(‘alt‘)
100                 img_src = t.get(‘src‘)
101                 list_data.append([name, img_src])
102         dict_data = dict(list_data)
103         return dict_data
104
105     def get_image_content(self, url):
106         """请求图片url,返回二进制内容"""
107         print("正在下载", url)
108         self.info.insert(‘end‘,"正在下载:"+url+‘\n‘)
109         try:
110             r = requests.get(url)
111             if r.status_code == 200:
112                 return r.content
113             return None
114         except RequestException:
115             return None
116
117     def download(self):
118         base_url = ‘https://www.dbmeinv.com/index.htm?‘
119         for i in range(1, int(self.page.get())+1):
120             url = base_url + ‘cid=‘ + str(self.get_cid()) + ‘&‘ + ‘pager_offset=‘ + str(i)
121             # print(url)
122             header = {
123                 ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q = 0.9, image/webp,image/apng,*/*;q=‘
124                           ‘0.8‘,
125                 ‘Accept-Encoding‘: ‘gzip,deflate,br‘,
126                 ‘Accept-Language‘: ‘zh-CN,zh;q=0.9,en;q=0.8‘,
127                 ‘Cache-Control‘: ‘max-age=0‘,
128                 ‘Connection‘: ‘keep-alive‘,
129                 ‘Host‘: ‘www.dbmeinv.com‘,
130                 ‘Upgrade-Insecure-Requests‘: ‘1‘,
131                 ‘User-Agent‘: ‘Mozilla/5.0(WindowsNT6.1;Win64;x64) AppleWebKit/537.36(KHTML, likeGecko) Chrome/‘
132                               ‘70.0.3538.102Safari/537.36 ‘
133             }
134             list_data = []
135             html = self.get_html(url)
136             # print(html)
137             dictdata = self.parse_html(html, list_data)
138
139
140             root_dir = self.input.get()
141             case_list = ["大胸妹", "小翘臀", "黑丝袜", "美腿控", "有颜值", "大杂烩"]
142             for t in case_list:
143                 if not os.path.exists(root_dir + ‘/pics‘):
144                     os.makedirs(root_dir + ‘/pics‘)
145                 if not os.path.exists(root_dir + ‘/pics/‘ + str(t)):
146                     os.makedirs(root_dir + ‘/pics/‘ + str(t))
147
148
149             if self.menu.get() == "大胸妹":
150                 save_path = root_dir + ‘/pics/‘ + ‘大胸妹‘
151                 for t in dictdata.items():
152                     try:
153                         # file_path = ‘{0}/{1}.{2}‘.format(save_path, t[1], ‘jpg‘)
154                         file_path = save_path + ‘/‘ + t[0] + ‘q‘ + ‘.jpg‘
155                         if not os.path.exists(file_path):  # 判断是否存在文件,不存在则爬取
156                             with open(file_path, ‘wb‘) as f:
157                                 f.write(self.get_image_content(t[1]))
158                                 f.close()
159                                 print(‘文件保存成功‘)
160                     except FileNotFoundError:
161                         continue
162
163             elif self.menu.get() == "小翘臀":
164                 save_path = root_dir + ‘/pics/‘ + ‘小翘臀‘
165                 for t in dictdata.items():
166                     try:
167                         # file_path = ‘{0}/{1}.{2}‘.format(save_path, t[1], ‘jpg‘)
168                         file_path = save_path + ‘/‘ + t[0] + ‘q‘ + ‘.jpg‘
169                         if not os.path.exists(file_path):  # 判断是否存在文件,不存在则爬取
170                             with open(file_path, ‘wb‘) as f:
171                                 f.write(self.get_image_content(t[1]))
172                                 f.close()
173                                 print(‘文件保存成功‘)
174                     except FileNotFoundError:
175                         continue
176
177             elif self.menu.get() == "黑丝袜":
178                 save_path = root_dir + ‘/pics/‘ + ‘黑丝袜‘
179                 for t in dictdata.items():
180                     try:
181                         # file_path = ‘{0}/{1}.{2}‘.format(save_path, t[1], ‘jpg‘)
182                         file_path = save_path + ‘/‘ + t[0] + ‘q‘ + ‘.jpg‘
183                         if not os.path.exists(file_path):  # 判断是否存在文件,不存在则爬取
184                             with open(file_path, ‘wb‘) as f:
185                                 f.write(self.get_image_content(t[1]))
186                                 f.close()
187                                 print(‘文件保存成功‘)
188                     except FileNotFoundError:
189                         continue
190
191             elif self.menu.get() == "美腿控":
192                 save_path = root_dir + ‘/pics/‘ + ‘美腿控‘
193                 for t in dictdata.items():
194                     try:
195                         # file_path = ‘{0}/{1}.{2}‘.format(save_path, t[1], ‘jpg‘)
196                         file_path = save_path + ‘/‘ + t[0] + ‘q‘ + ‘.jpg‘
197                         if not os.path.exists(file_path):  # 判断是否存在文件,不存在则爬取
198                             with open(file_path, ‘wb‘) as f:
199                                 f.write(self.get_image_content(t[1]))
200                                 f.close()
201                                 print(‘文件保存成功‘)
202                     except FileNotFoundError:
203                         continue
204
205             elif self.menu.get() == "有颜值":
206                 save_path = root_dir + ‘/pics/‘ + ‘有颜值‘
207                 for t in dictdata.items():
208                     try:
209                         # file_path = ‘{0}/{1}.{2}‘.format(save_path, t[1], ‘jpg‘)
210                         file_path = save_path + ‘/‘ + t[0] + ‘q‘ + ‘.jpg‘
211                         if not os.path.exists(file_path):  # 判断是否存在文件,不存在则爬取
212                             with open(file_path, ‘wb‘) as f:
213                                 f.write(self.get_image_content(t[1]))
214                                 f.close()
215                                 print(‘文件保存成功‘)
216                     except OSError:
217                         continue
218
219             elif self.menu.get() == "大杂烩":
220                 save_path = root_dir + ‘/pics/‘ + ‘大杂烩‘
221                 for t in dictdata.items():
222                     try:
223                         # file_path = ‘{0}/{1}.{2}‘.format(save_path, t[1], ‘jpg‘)
224                         file_path = save_path + ‘/‘ + t[0] + ‘q‘ + ‘.jpg‘
225                         if not os.path.exists(file_path):  # 判断是否存在文件,不存在则爬取
226                             with open(file_path, ‘wb‘) as f:
227                                 f.write(self.get_image_content(t[1]))
228                                 f.close()
229                                 print(‘文件保存成功‘)
230                     except FileNotFoundError:
231                         continue
232
233     def cle(self):
234         """定义一个函数,用于清空输出框的内容"""
235         self.info.delete(1.0,"end")  # 从第一行清除到最后一行
236
237
238 def main():
239     t = DB()
240     t.gui_arrang()
241     tk.mainloop()
242
243 if __name__ == ‘__main__‘:
244     main()

关键点:

1.如何使用tkinter调用系统路径

2.构造url,参数化图片分类、抓取页数

3.使用tkinter获取输入参数传给执行代码



下面是练习的时候写的简陋版,不包含tkinter,主要是理清思路:

  1 import re
  2 import requests
  3 import os
  4 from requests.exceptions import RequestException
  5
  6 case = str(input("请输入你要下载的图片分类:"))
  7 category = {
  8    ‘DX‘: 2,
  9    ‘XQT‘: 6,
 10    ‘HSW‘: 7,
 11    ‘MTK‘: 3,
 12    ‘YYZ‘: 4,
 13    ‘DZH‘: 5
 14 }
 15 def get_cid():
 16     cid = None
 17     if case == "大胸妹":
 18         cid = category["DX"]
 19     elif case == "小翘臀":
 20         cid = category["XQT"]
 21     elif case == "黑丝袜":
 22         cid = category["HSW"]
 23     elif case == "美腿控":
 24         cid = category["MTK"]
 25     elif case == "有颜值":
 26         cid = category["YYZ"]
 27     elif case == "大杂烩":
 28         cid = category["DZH"]
 29     return cid
 30
 31
 32
 33 base_url = ‘https://www.dbmeinv.com/index.htm?‘
 34 url = base_url + ‘cid=‘ + str(get_cid())
 35 r = requests.get(url)
 36 # print(r.status_code)
 37 html = r.text
 38 # print(r.text)
 39 # print(html)
 40
 41 name_pattern = re.compile(r‘<img class="height_min".*?title="(.*?)"‘, re.S)
 42 src_pattern = re.compile(r‘<img class="height_min".*?src="(.*?.jpg)"‘, re.S)
 43
 44 name = name_pattern.findall(html)  # 提取title
 45 src = src_pattern.findall(html)  # 提取src
 46 data = [name,src]
 47 # print(name)
 48 # print(src)
 49 d=[]
 50 for i in range(len(name)):
 51     d.append([name[i], src[i]])
 52
 53 dictdata = dict(d)
 54 # for i in dictdata.items():
 55 #     print(i)
 56
 57 def get_content(url):
 58     try:
 59         r = requests.get(url)
 60         if r.status_code == 200:
 61             return r.content
 62         return None
 63     except RequestException:
 64         return None
 65
 66 root_dir = os.path.dirname(os.path.abspath(‘.‘))
 67
 68 case_list = ["大胸妹","小翘臀","黑丝袜","美腿控","有颜值","大杂烩"]
 69 for t in case_list:
 70     if not os.path.exists(root_dir+‘/pics‘):
 71         os.makedirs(root_dir+‘/pics‘)
 72     if not os.path.exists(root_dir+‘/pics/‘+str(t)):
 73         os.makedirs(root_dir+‘/pics/‘+str(t))
 74
 75 def Type(type):
 76     save_path = root_dir + ‘/pics/‘ + str(type)
 77     # print(save_path)
 78     for t in dictdata.items():
 79         try:
 80             #file_path = ‘{0}/{1}.{2}‘.format(save_path, t[1], ‘jpg‘)
 81             file_path = save_path + ‘/‘ + t[0]+ ‘q‘ +‘.jpg‘
 82             print("正在下载: "+‘"‘+t[0]+‘"‘+t[1])
 83             if not os.path.exists(file_path):  # 判断是否存在文件,不存在则爬取
 84                 with open(file_path, ‘wb‘) as f:
 85                     f.write(get_content(t[1]))
 86                     f.close()
 87         except FileNotFoundError:
 88             continue
 89 if case == "大胸妹":
 90     Type(case)
 91
 92 elif case == "小翘臀":
 93     Type(case)
 94
 95 elif case == "黑丝袜":
 96     Type(case)
 97
 98 elif case == "美腿控":
 99     Type(case)
100
101 elif case == "有颜值":
102     Type(case)
103
104 elif case == "大杂烩":
105     Type(case)

效果如下

原文地址:https://www.cnblogs.com/hanmk/p/11192066.html

时间: 2024-10-12 01:57:01

使用python做一个爬虫GUI程序的相关文章

用python做一个搜索引擎(Pylucene)

什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信息到网络信息库之中(一般使用爬虫):然后信息整理模块对采集的信息进行分词.去停用词.赋权重等操作后建立索引表(一般是倒排索引)构成索引库:最后用户查询模块就可以识别用户的检索需求并提供检索服务啦. 图1  搜索引擎的一般结构 2.  使用python实现一个简单搜索引擎 2.1  问题分析 从图1看,一个完整的搜

一个无锁消息队列引发的血案:怎样做一个真正的程序员?(二)——月:自旋锁

前续 一个无锁消息队列引发的血案:怎样做一个真正的程序员?(一)——地:起因 一个无锁消息队列引发的血案:怎样做一个真正的程序员?(二)——月:自旋锁 平行时空 在复制好上面那一行我就先停下来了,算是先占了个位置,虽然我知道大概要怎么写,不过感觉还是很乱. 我突然想到,既然那么纠结,那么混乱,那么不知所措,我们不如换个视角.记得高中时看过的为数不多的长篇小说<穆斯林的葬礼>,作者是:霍达(女),故事描写了两个发生在不同时代.有着不同的内容却又交错扭结的爱情悲剧,一个是“玉”的故事,一个是“月”

做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk

前言:"懒"在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! 一.懒人说书 Android.mk中LOCAL_SRC_FILES需要罗列出所有参与编译的文件,这样在.cpp文件少的时候还可以一个一个添加,当有几百个文件的时候会十分的痛苦! 我们下看看TestCpp工程中的Android.mk文件: 这只是节选的一部分,大概只有50个左右吧,除数量多

做一个“合格”的程序员

其实这篇文章很早就想写了,一直忙的没有时间,今天总算得空,下面就针对程序员这个职业来说一说我个人的一些想法: 要想做一个在我认为是"合格"的程序员,那么应该要做到以下几点: 代码规范,注释清楚 要做一个好的程序员,代码的质量是最重要的,代码是项目过程中最为重要的资源,有很多程序员觉得写注释太麻烦,还会花太多时间,尤其是很多规模比较小的公司,更不会注重这一点,但是往往到了项目后期,乃至项目由他人接手后,维护的成本会变得非常高,代码阅读困难,注释不详细甚至没有,维护人员需要靠自己去猜测某个

如何做一个开心的程序员?

经常有人发帖讨论「怎么做一个成功的程序员」,「如何才能成为一个优秀的程序员」,我并不太同意这些文章中的看法,想在这里我想提出一些我对于程序员这个职业自己的想法. 和标题中写的一样,我的目标不是成为一个优秀或者成功的程序员,我想成为一个开心的程序员.因为程序员是一个工作和生活密不可分的职业只有成为一个开心的程序员,才能过着开心的生活. 我相信那些想让自己或者别人成为优秀的程序员的人的最终目的也是能过上更开心的生活:少一点烦恼,多一点自由做自己想做的事情. 可能大家会不太同意我对开心的生活的定义,这

做一个“有资格”程序猿

其实这篇文章是很早就想写一,一直忙到没时间,今天终于是空的,继本职业工作方案谈猿我个人的一些想法: 要想做一个我觉得是"亲密格"程序猿.该要做到下面几点: 代码规范,凝视清楚 要做一个好的程序猿,代码的质量是最重要的,代码是项目过程中最为重要的资源.有非常多程序猿认为写凝视太麻烦,还会花太多时间,尤其是非常多规模比較小的公司,更不会注重这一点,可是往往到了项目后期.乃至项目由他人接手后,维护的成本会变得非常高,代码阅读困难,凝视不具体甚至没有.维护人员须要靠自己去推測某个方法的具体功能

java web程序 上机考试做一个登陆注册程序

大二期末 java web.用到数据库,jdbc.myeclipse实现用户的注册,登陆 并且不能出现500错误,用户不能重复注册.当用户任意点击时也不能出现500错误! 这里.我只写注册成功的页面.这个不让用户重复注册 当时老师对我各种扣分.可后来.我问他的时候,他说不出来.我不是那个第一个提交作业的学生,可我的分数却比他低,我的功能比他多一个好吧 无所谓啊  谁叫我那么背时,再也不想问了.特别烦躁了 registerOk.jsp <body> <% String name=reque

做一个“懒惰”的程序员

懒惰,算是本人的一大缺点,但是我发现,事物的两面性在懒惰上得到充分体现.懒惰,并非一无是处. 比如,编写脚本. 本人编写脚本的原因有两个:一是省事,不用每次敲那么多东西.二是本人健忘,无法记得冗长的命令. 就拿IPC的代码来讲, IPC代码根目录中,有N多build-XXX.而每一个build-XXX目录下的内容,则完全相似,都有一个set.sh. 这就是编译用的脚本. 随便拿出一个来,其内容大致如下: cmake .. -DCROSS_COMPILE=arm-hisiv100nptl-linu

如何做一个合格的程序员

不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远.世界上并没有成为高手的捷径,但一些基本原则是可以遵循的. 1. 扎实的基础.数据结构.离散数学.编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序.据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件.程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论.不要一开始就去学OOP,即使你再