前言
前些天在逛论坛的时候突然发现了一篇文章,标题是通过编程自动化提高自己博客访问量的。我想了下,突然感觉可以用学过的Python的简单知识来实现这一目的。主要原理就是BeautifulSoup+urllib的组合,通过BS解析网页,获取目录,然后深入,获取文章的url,通过urllib.request模块尝试连接CSDN的服务器。说干就干
脚本实现
1 | from bs4 import BeautifulSoup |
UI实现
用PyQt5将程序的大致控件摆放完成了:
将pyqt生成的ui文件直接通过命令生成.py文件
1 | pyuic5.bat -o layout.py untitled.ui |
UI、逻辑处理
遇到的一些问题
在这次编写GUI的过程中,我遇到了原来没有的问题。
以往的时候,如上篇文章,通过Python的QR模块生成QR二维码,因为逻辑非常简单,只是单纯的将所需要转换的数据变换成为相应的0、1二进制码,然后放到图片中的相应位置上,所以不会花费太多的时间,逻辑部分与界面部分就直接写在了一起没有问题。
这次刚开始的时候,我也没注意,直接就还是写在一块,由于牵扯到了url网络连接部分,所以不可避免的出现了阻塞现象。几乎在所有的GUI设计中,如果当长时间出现阻塞、无状态回应情况,都会出现界面的未响应状态,所以我想到了在Android开发中相当常规的子线程与UI线程通信,Handler的使用,在PyQt中也有类似的机制,也就是Qt的核心机制,信号槽机制,更多的内容可以看我另外的文章,我会详细的介绍下。
下面是我修改完成后的代码,可以顺利完成我预设的功能:
1 | import urllib.request |
总结
由于使用了designer默认的绝对布局方式,代码比较杂乱。总的来说也就分3个模块:
网页获取、解析工作类 Grab
界面布局、实时数据展现类 Ui_Form
逻辑控制、监控与沟通类 MyThread
各个模块相互合作,实现功能.
通过Requests、Xpath改写
这是后来补上的.
在我完成这篇文章之前的部分的时候,还是对python刚入门,使用了比较经典的一些网络模块。后来通过一些实例练习,接触到了一些简洁、优雅的模块,通过这些模块继续完善。
Grab类
1 | class Grab(): |
- Request模块
在上网认证这篇文章有过大概的介绍。模块通过提供极其简单的方法名称接口,隐藏了复杂的网络工作,大大简化了代码。
- Xpath
Xpath介绍Xpath不是一个模块,而是活跃在众多平台的一种工具,也可以称她是一种语言。通过对网页源代码解析,内部构建路径,轻松获取想要的内容。在BeautifulSoup太沉重复杂、又不想使用正则的情况下,是一种很棒的解决方案。
MyThread类
1 | class MyThread(QtCore.QThread): |
去掉time.sleep(seconds)
推迟线程调用之后,会出现网络模块报错,这应该是所有网络模块都会碰到的情况。