主要实现功能
从网页爬取关键信息,展示在自己写的界面上。
从http://www.5ppt.net/aricle.asp?id=3947&p=1,获取各个国家的疫情信息。
实现思路
- 使用request库,调用request.get(),爬取网页内容
- 使用re库,使用正则表达式,在网页内容中各个国家的疫情人数,存在一个列表中。
- 使用PyQt5库,构建一个包含进度条,按钮,标签的界面,展示获得的数据。
实现步骤
一、构造函数
构建界面,所以定义一个类,在构造函数中,声明需要调用的函数和属性。
界面需要多个进度条和标签,所以得列表形式
需要爬取网页信息的方法
需要生成界面的方法
网页信息存储在self中,所以在声明一个存网页信息的列表
写程序经验:需要多次传递的写在self中,最好事先在构造函数中声明。
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.pbar = [] #界面进度条
self.lab = [] #界面标签
self.infos = [] #爬取信息
self.epidemic() #执行爬虫任务
self.initUI() #执行生成界面
二、爬虫函数
从网页中爬取信息,这种信息一定是有特点的信息,比如这个网页中各个国家新冠人数的信息
在网页上显示是:
右击打开网页源码,显示是:
可以看到关键信息都有固定模式,汉字+冒号+数字+例,只要符合这个类型的,都匹配出来,存在self.infos中。
用两个()分别括住国家信息和人数信息,在正则结果中用列表的下标可以快速得到想要的信息。
注意要点:
- 这个网页一共有5页,通过网址最后的‘3947&p=几’来分开,比如‘3947&p=2’打开就是第二页,所以需要匹配五次,分别对5个不同的网址。
- 需要改变网页的编码方式,通常为‘UTF-8’,也可以写成r.encoding = r.apparent_encoding,汉字不会变为乱码。
- 匹配结果是列表,包含两个元素的列表,需要把他添加到self.infos中。
def epidemic(self):
url = "http://www.5ppt.net/aricle.asp?id=3947&p="
for i in range(1,5):
url_new = url+str(i)
r = requests.get(url_new)
if r.status_code == 200:
r.encoding = r.apparent_encoding#改变编码方式
result = re.findall('([\u4e00-\u9fa5]+):(\d+)例',r.text)#‘[\u4e00-\u9fa5]’匹配中文的意思
#正则表达加()分组,变为列表,便于后续处理
if result != []:
for one_info in result:
self.infos.append(one_info)
print(self.infos)
界面函数
for循环得到进度条列表和标签列表,相对简单
注意要点:
- 把进度条和标签对象,一个一个添加到对应的列表中
- 单独创建一个按钮对象,并且需要间接点击触发的事件。
- 各个控件的位置需要调试放在合适的位置。
def initUI(self):
for i in range(len(self.infos)):
self.pbar.append(QProgressBar(self))
self.lab.append(QLabel(self))
self.pbar[i].setGeometry(120,80+30*i,200,25)
self.lab[i].setGeometry(50,80+30*i,60,30)
self.lab[i].setText(str(i))
self.pbar[i].setValue(0)
self.btn = QPushButton('显示数据',self)
self.btn.move(120,20)
self.btn.clicked.connect(self.doAction)
self.setGeometry(600,100,380,800)
self.setWindowTitle('进度条')
self.show()
项目入口
注意判断if name == ‘main’:,再开始执行主函数。
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())