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


猜你喜欢
- 科学设计你的网站网页:来自 Eye-Tracking研究的23节必修课 ——Christina Laun在网络设计领域关于Eye-
- QQ通过返回不同的图片,来表示在线或离线,图标也随之变换,既然图片不同,那么,返回的HTTP头信息中的Content-Length 也一定不
- 一般情况下,访问或设置剪贴板,IE 只需使用 window.clipboardData 的 getData 或 setData 方法即可。M
- 一个简单的例子:将如下代码另存为.wsc文件,并右键“注册”(卸载时右键“不注册”)。<Component> <regis
- 最近需要将实验数据画图出来,由于使用python进行实验,自然使用到了matplotlib来作图。下面的代码可以作为画图的模板代码,代码中有
- 如下所示:class EmptyDelegate(QItemDelegate): def __init__(self,paren
- 1.在爬虫文件中只需要解析提取出图片地址,然后将地址提交给管道在管道文件对图片进行下载和持久化存储class ImgSpider(scrap
- 获取首页元素信息:目标 test_URL:http://www.xxx.com.cn/首先检查元素,a 标签下是我们需要爬取得链接,通过获取
- 本文研究的主要是python处理csv数据动态显示曲线,分享了实现代码,具体如下。代码:# -*- coding: utf-8 -*- &q
- 简介主要介绍事件总线的定义和编写方法和Vue是如何实现消息的订阅与发布的。事件总线事件总线是组件间通信的一种方式,适用于任意组件间的通信,比
- Python-pip安装失败问题一、问题描述root@ubuntu:/home/chao# apt-get install python-p
- 最近vue更新的2.0版本,唉,我是在2.0版本前学习的,现在更新了又要看一遍了,关键是我之前看了3个星期2.0就更新了,vux还没同步更新
- python 远程统计文件#!/usr/bin/python#encoding=utf-8import timeimport osimpor
- 关于CIFAR10数据集的使用主要解决了如何把数据集与transforms结合在一起的问题。CIFAR10的官方解释torchvision.
- 这是个人对selenium.webdriver写的一些常用操作的二次封装,也就相当于重写了,不再使用自带的框架,用自己写的框架完成。这样的话
- 主要原理:调整dicom的窗宽,使之各个像素点上的灰度值缩放至[0,255]范围内。使用到的python库:SimpleITK下面是一个将d
- 说在前面和word的文本相比PDF更类似于一张张图片,图上放着一个个文字。对其的解析是将图片上的文字提取到text文件中,方便之后的分析。添
- 1.var、let、const简介 ECMAS
- prototype 是在 IE 4 及其以后版本引入的一个针对于某一类的对象的方法,而且特殊的地方便在于:它是一个给类的对象添加方法的方法!
- 说起来惭愧,总是犯一些小错误,纠结半天,这不应为一个分号的玩意折腾了好半天! 错误时在执行SQL语句的时候发出的,信息如下: Java代码