私家文档,仅供参考!
前语:我本是一名前端开发,不能说熟悉…最起码前端现在干流技能 Vue React 仍是 jQuery 都有运用过。可以说这三个也是包含最少 60%的运用场景了。突然转变去写 Python 真的很不适应,不过还好。也是一种训练。当初我的主意是 做一个
Web平台
配合 Java 来调用写好的 Python。当然啦,期间我也运用过 Nodejs 来写后端,成果不太理想。经过一周半的编写,调试,终于可以对接后端,我传递参数给接口,接口服务调用 Python 然后把数据回来给我的一起刺进数据库。但是…我仍是想的太简略了,中间各种问题层出不穷,真的要把我搞溃散了。加班到十点多,回家了一向和朋友调试到凌晨,问题仅仅处理了一半…后来经过一番商讨,我反思自己,为什么要做的这么”完美“呢?能用不就好了。于是痛定思痛!想了一晚上,脑子里突然蹦出一个主意!我什么…非要做个Web端
呢?直呼握草,立马坐起来拍大腿!我记得 Python 好像是可以写桌面端运用的!!于是次日上班。直接开干!!
软件介绍
软件运行时直接生成txt和csv两种文件。可选
操作流程:
graph TD
手动输入关键词 --> 页数
导入文件 --> 页数--> 履行--> 新建文件而且刺进数据
先看一下软件成品吧(截至文章发布前) 以及我的GitHub地址
这款桌面端运用现在的功用包含但不限于:分词循环爬取查找
、导入文件爬取
、软件设置
、在线更新
、使命/过错捕获输出
、当前进展
、自动更新署理
等
运用技能及三方库
言语运用的是 Python39 用到的库包含但不限于 PyQt5、requests、BeautifulSoup、os、time、urllib、tldextract、random、psutil、chardet。 我就捡几个要点说说吧(仅限于个人了解)。
PyQt5: 这个库便是标题所写 GUI(Graphics User Interface),中文名称为图形用户界面,是计算机与其运用者之间的对话接口。我之前用的是 tk 界面实在是!太丑了!
psutil: 专门用来获取操作系统以及硬件相关的信息,比如:CPU、磁盘、网络、内存等等
requests: 如你所见,便是用来恳求的
代码结构
序首要分为两个类:Spider 和 MainWindow。
Spider 类首要完成了以下几个办法:
MainWindow 类首要完成了以下几个办法:
简略来说Spider负责主线程爬虫逻辑编写,而MainWindow便是负责 GUI 的绘制以及软件的操作反馈等。
部分代码介绍
爬虫这块代码我就不介绍了。由于每个、任何一个爬虫都是独一无二的,无非便是 get 访问网页拿到源代码,然后经过各种方式例如类 ID 来进行定位 提取而已。
介绍Spider的:
run_getiCookie
办法,这个办法可能不适合绝大部分人,由于我爬取的是神马查找引擎,他的 Cookie 是每次恳求都会改变,假如你拿了一个一向用,不出五次,肯定反爬。所以我做的操作是 一个 Cookie 就用两次。
下面是代码
def run_getiCookie(self):
urls = 'https://访问一个能拿到Cookie的地址'
response= requests.get(urls) # get访问网页
cookie = response.headers['Set-Cookie'] # 使用response库自带办法取提取header里面的Cookie 然后贮存到外部,
return { # 最终回来咱们恳求所需求的恳求头参数
'User-Agent': random.choice(agent_list), #这个办法是在许多User-Agent列表里每次提取一个,避免反爬。
"Accept-Encoding":'参数',
"Accept-Language":'参数',
"Server": "参数",
"Content-Type": "参数",
'Cookie':cookie
}
介绍MainWindow的:
show_error
办法是用于在过错输出框中显现过错信息。该办法接受一个 message 参数,用于指定要显现的过错信息。在办法内部,运用 Qt 的 appendPlainText 办法将 message 添加到过错输出框中。该办法首要用于在程序履行过程中呈现过错时,将过错信息显现给用户,方便用户进行排查和处理。该办法的代码如下:
@staticmethod
def show_error(self, error_msg):
#静态办法,供外部调用
# 在过错输出文本框中显现过错信息
#可以运用append
self.error_output.setPlainText(error_msg + '\n')
def show_errorMainWindow(self, error_msg):
self.error_output.setPlainText(error_msg + '\n')
可能有的人就问了,为什么相同功用的代码要写两遍呢?
对,我也没办法技能有限。由于不同的类调用办法的话,针对于这个函数,我不太熟悉,其他函数我能调用,我也不知道这个为什么。于是我就写了一个静态的,外部可以直接MainWindow.show_error(str(e))
,来调用,但是我自身函数假如调用的话是不可行的,由于staticmethod
的缺陷有许多,但是对我来说,最重要的一条是
静态办法无法访问类的实例变量和办法,由于静态办法不会自动传递类的实例作为第一个参数。这意味着静态办法无法访问类的状态,也无法修改类的状态。
这也就意味着,我无法运用这个办法捕获过错,来展现到过错输出上去。所以无法暂时写两个。
select_file,stop_script,cancel_import
这几个办法很简略了,便是导入文件、退出软件、删去导入的文件。
get_next_word
这个办法我也折腾了一会,首要是,我的词语有两个途径,手动和文件。而且文件的词语量常常大于五十万,我现在是用一百万词量测验的。
下面看代码:
#简化版
def get_next_word(self):
if not self.words:
QMessageBox.information(self, '提示', '文件未导入')
return None
else:
word = next(self.words, None)
print(word)
if word is not None:
return word
else:
self.task_output.insertPlainText(f'一切词语查询完毕\n')
self.task_output.update()
return None
首要判断导入的文件是否为空,假如为空,则弹出提示框,提示用户文件未导入,并回来 None。假如导入的文件不为空,则运用 Python 的内置函数 next 从文件中获取下一个关键词,假如获取成功,则回来该关键词。假如获取失败,则表明一切关键词已经查询完毕,此刻在使命输出框中刺进一条提示信息,并回来 None。
OK!写完
本文同步 我的笔记
End