Python解决爬虫程序卡死问题
作者:??梦想橡皮擦???? 发布时间:2021-04-02 15:34:32
前言:
之前的文章我们已经开启了爬虫程序的exe之旅,但是我们最终实现的程序存在一个非常大的问题,当进行网络请求的时候,程序卡死,直到数据请求回来之后,程序才会从假死状态解脱出来,今天这篇博客核心将这个问题解决掉。
导致该问题产生的原因是GUI程序在执行高IO操作的时候很容易出现假死和无响应的状态,通用解决办法就是多线程。
如果想扩展开本知识点的学习,可以在搜索引擎搜索 tkinter假死,未响应等关键字即可
简单粗暴解决问题
找到上节课需要修改的代码部分 :
修改成如下代码,立马解决问题:
def thread_down(func, *args):
# 创建线程
t = threading.Thread(target=func, args=args)
t.setDaemon(True)
# 启动
t.start()
# 创建按钮
btn = tk.Button(win,text = '分析下载', command = lambda :thread_down(down_img))
当然记得在头部导入线程模块:
import threading
对于咱们常写爬虫的Coder来说,多线程就不用过多的解释了,非常容易理解,注意下t.setDaemon(True)
通过 t.setDaemon(True) 将子线程设置为守护进程(默认False),主线程结束后,守护子线程随之中止。
以上是最简单的解决办法了,顺着这个思路慢慢的修改你的程序即可
增加一点点难度的解决方案
该方案假设你的爬虫比较复杂一些,用的是类去编写的,那么增加一个类文件即可,该类继承 threading.Thread 类
class MyThread(threading.Thread):
def __init__(self, func, *args):
super().__init__()
self.func = func
self.args = args
self.setDaemon(True)
self.start() # 构造方法中启动线程
def run(self):
self.func(*self.args)
# 创建按钮
btn = tk.Button(win,text = '分析下载', command = lambda :MyThread(down_img))
上述解决办法也比较简单,重点依旧是将I/O耗时操作放置到一个新的线程中去
我们重点注意在上述的代码中tk.Button(win,text = '分析下载', command = lambda :MyThread(down_img))
中我们给command绑定值的时候用到的lambda函数
lambda这个大家都知道是匿名函数,在这里的用法注意是tk要求的。
他表示 传参数Button绑定事件,文档中大概意思如下:
我们使用Button传递数值时,需要用:
lambda: 功能函数(var1, var2, ……)
所以大家在使用的时候,注意该问题哦~~
我们继续给爬虫程序加点料
上面已经解决了一个小问题,这些当然是不够的,我们的程序岂止于此,接下来,我们每次访问页面的时候,网页源码的图片规则肯定是不能确定的,所以用户可以自定义正则表达式去匹配数据,就是我们接下来改进的方向啦~
先把程序窗口扩大一些
# 窗体大小设置
width = 800
height = 600
增加一个文本框和一个多行输入框:
lbtip = tk.Label(win, text='请输入正则表达式:')
# 添加到窗口中
lbtip.grid(row=1,column=3,pady=20)
# 创建一个多行文本框 - 用于输入正则表达式
t1 = tk.Text(win, width=40,height=20)
# 添加到窗口中
t1.grid(row=2,column=3,padx=20,columnspan=3)
看看布局,细节可以在调整一下:
获取正则表达式输入框数据:
这个地方一个小知识点需要补充下,在tkiner中有两种文本框,单行和多行,对于里面内容的获取方式也不同
#get()方法获取Entry 文本框的内容:
txt = entry.get()
#get()方法获取Text 文本框的内容:
txt = text.get("0.0", "end")
Text.get(start, end) 的用法:
Text.get("0.0", "end") 解析: 第一个参数‘0.0’是指从第0行第0列开始读取(‘0.3’表示从第0行第3列开始读取),第二个参数end表示最后一个字符
写完测试下:
测试完毕:
尾声
tkiner
其实写起来慢慢调整还是蛮有意思的,可以用来开发一些不错的小工具
测试连接 http://baijiahao.baidu.com/s?id=1667856639211368322
测试正则 <img class="large" data-loadfunc=0 src="(.*?)"
来源:https://juejin.cn/post/7089825043907084301
猜你喜欢
- 这个帖子在51js看到的,觉得很有学习意义,看看高手们是怎么做的吧!提问者:infinte急求:正则或算法,JS VBS均可。要求:[1]支
- 本文实例讲述了Python使用迭代器捕获Generator返回值的方法。分享给大家供大家参考,具体如下:用for循环调用generator时
- 官方网站:http://www.extjs.com/演示地址:http://www.yaohaixiao.com/effects/sampl
- 今天再为大家提供一种方法:不需要安装Excel也可以导入到我们的SQL Server数据库。首先用SQL Server自身的数据转换功能把E
- 本文实例讲述了Python实现的数据结构与算法之基本搜索。分享给大家供大家参考。具体分析如下:一、顺序搜索顺序搜索 是最简单直观的搜索方法:
- pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。pip检测更新命令:pip list –
- 记录一下如何用python爬取app数据,本文以爬取抖音视频app为例。编程工具:pycharmapp抓包工具:mitmproxyapp自动
- 废话不多说了直接给大家介绍canvas实现手机端用来上传用户头像的代码,具体代码如下所示:<!DOCTYPE html><
- 代码如下:---在仓储管理中经常会碰到的一个问题 一、关于LIFO与FIFO的简单说明 ---FIFO: First in, First o
- 西贝做了许久的交互设计工作,每年的目标都有不同,却发现今年没有什么提高和改进的地方。也许是自己没有回头总结,总是被这样那样的借口推脱。最近休
- 最近 全栈数据工程师养成攻略 的微信群已经将近500人,开了二群之后为了打通不同微信群之间的消息,花了点时间做了个消息同步机器人,在任意群收
- 准备篇1.配置防火墙,开启80端口、3306端口1 vim /etc/sysconfig/iptables2 -A INPUT -m sta
- 加强ASP网站后台安全一些主要措施:----------------------------------------------------
- 这个javascript农历日历,万年历代码网上看到的,很不错,功能齐全,值得收藏!功能介绍:动态显示当前世界各国各时区时间,显示当前农历,
- 大家都用过企业管理器中的--“收缩数据库”,里面的功能的确可以收缩数据库的日志文件(.ldf)和数据文件(.mdf),但都会发现同样的问题,
- 最近心情非常差,而且还没有触底的样子,哎~~~总是会忍不住叹气~~~前些日子在Twitter上叨唠说“不在乎IE8什么时候推出,只在乎IE6
- 例一:#!/usr/bin/pythonimport sysimport reif __name__=
- hanxiaolian 为了躲避 lake2 ASP站长管理助手而写.. 一.绕过lake2 Asp木马扫描的小马 代码如下:<%&n
- 一.背景在现在的网站中,接入的渠道是越来越多了,技术也是越来越先进,WAP, SMS,EMAIL, 传统的Web, Socket等等,如果连
- 1. python中创建新的csv文件(1). 使用csv.writer()创建:代码如下:import csvheaders = [