作为一个很喜欢看书的人,有时候在网页上看小说,会被数不胜数的广告弄的很烦,刚好最近在研究python,就自己写了一个小说爬虫,并用pyqt做了图形界面。
下面介绍一下主要思路,不过就不开源了,因为我的程序目前写的也不怎么样,可以使用,但用起来不怎么舒服,性能也有待优化。
一、需求分析
需求分析很重要,不过我要做的只是一个小项目,而且我既是用户也是开发者,就没仔细的做需求分析。简单来说,功能需求有:搜索小说,下载小说,查看书架,看小说(根据目录选择章节)
二、界面设计
已经确定了功能需求有4个,初步想法就是做4个页面:搜索,下载,书架,阅读。不过搜索和下载可以合并为一个页面,所以只需3个页面即可。
但是如果做一个主窗口,再做三个功能窗口,每次选择一个功能时,都要弹出窗口,感觉比较麻烦,所以我用了QSplitter和QFrame控件进行窗口内页面替换,类似steam的商店,库,社区按钮的效果。
下面展示一下我做的界面,比较质朴,都是用的最原始的控件。
书架
bookshelf.png搜索
search.png阅读
read.png三、主要功能的实现和封装
仔细分析一下功能需求,具体要做的事都有:
搜索:发送http请求,得到搜索内容
下载:抓取小说的所有内容
书架:读取本地已下载的书,显示
阅读:显示小说目录,选取章节显示本章内容
其实不难看出,搜索和下载,用到的其实就是爬虫;而其他的都是对pyqt的一些基础控件控件的操作。而对于基础控件的操作较为简单,所以这个项目的核心是爬虫。
我决定采用urllib库和BeautifulSoup库写爬虫。
爬虫对于不同的网站,要作出相应的调整。具体怎么写这里不加赘述,同样只提供思路:
先通过urllib库抓取网页内容,然后用beautiful soup进行解析。
(beautiful soup非常强大,可以方便的处理HTML和xml等格式的文件。)解析得到需要的结果,写入文件或在pyqt的控件中显示。
四、初步优化
软件构思的非常好,但写出来后,发现不尽如人意,性能,稳定性都需要改进。具体表现在:
1.抓取加分析网页的时间较长,若小说章节多,则下载耗时长。
2.循环抓取每一章有可能卡住,导致无法继续抓取。经过分析是urllib.request会卡死,具体原因还在研究。
目前我采用了两个措施来进行改进:
1.多线程抓取
最多开设5个线程进行抓取,可以节省下载时间。而且提高程序的稳定性:若一个线程停止,还可以有其他线程进行抓取。
2.pv操作防止死锁
这个是为了解决线程的同步性问题和限制最大线程数的。具体请参见操作系统死锁方面的相关知识。我是使用threading.Semaphore进行信号量的pv操作。
五、打包成可移植的EXE文件
我使用了pyinstaller进行多个py文件的打包,打包为可移植的exe文件。最近有时间了可能会写一篇博客介绍pyinstaller的用法。网上也可以很容易的查到,这里就不多说了。
最后说一点感想:
很久没有静下心来研究技术,开发程序了。平时要上课,没有成块的时间。刚好趁着假期,做点想做的东西。
同时,纸上得来终觉浅,绝知此事要躬行,在做这个软件的过程中,我也实际运用了在课上学过的一些东西。
之前,我做软件基本只注重结果。程序只要能运行成功,满足使用要求就行了。在学完人机交互之后,现在我在开发软件的过程中,也在时刻注意编程的规范性和可维护性,注意对写的代码进行合理的封装。
另外,我原来也写过多线程的程序,但是不知道线程的同步可能产生的问题,程序的健壮性可想而知。最近通过学习操作系统,我了解了死锁、临界区等在并发需要注意的东西,而且也在实际编程中对其进行了处理。
总而言之,这个项目我还会继续做下去。一方面这个软件对自己有用,另一方面也可以激励自己更加深入的学习一些东西,并且实际运用。
网友评论