qpython编写爬虫_Python - 用 PyQt 写爬虫界面
打開壓縮包會看到四個文件。
使用說明已經簡單交代了軟件的用法。
templete.xls 和 data.txt 文件可以先忽視,后續會交代這兩個文件的作用。
先打開 pyYouthExcel-ver2.0.exe
初次打開軟件會看到兩個窗口。
左邊黑乎乎的窗口是控制臺
當程序出錯或者無響應的時候,可以通過控制臺看到反饋的信息。
右邊的窗口就是程序的主界面。
這個界面就是軟件主界面
最上面是數據獲取設置,清除掉輸入框中的文本可以看到輸入提示。
沒錯,這里獲取的就是文件夾中的兩個文件信息。
當然也可以自己創建相關的文件,點擊選擇可以選到相關的路徑中
獲取完之后,界面會出現完整的路徑
這個路徑和之前的 data.txt 路徑有什么不同效果嗎?
其實兩個路徑都實現了相同的功能。
路徑很長的稱之為絕對路徑,從盤符開始索引。
路徑很對的稱之為相對路徑,從當前程序所在的目錄開始索引。
下面就是 輸入網頁URL 的區域了
這里可以將青年之聲的提問鏈接輸入進去
當然也可以輸入多條鏈接,鏈接之間用回車分行即可
再下面就是選擇文件保存路徑
基本操作相信也不用說明了,直接輸入文件名稱則以相對路徑保存到當前程序啟動目錄中。
確認輸入無誤之后,點擊一鍵統計。
執行完畢之后可以在目錄中看到多了兩個文件
其實只是多出了生成文件, qt.conf 文件在打開程序之后自動生成,不影響使用。
下面打開 test.xls 文件
所有的統計操作都通過程序完成了。
程序操作講解完畢,重點來看看配置文件都是什么吧
data.txt 存儲的是同學的相關信息
另外有一個快捷的操作,務必使用此方法。
在Excel上復制同學們的信息
可以直接粘貼到txt文檔中
代碼背后會識別這個間隔,輸入正確才能讓程序正確運行。
手動輸入這個間隔 不是按空格 而是按鍵盤 Tab 鍵
!!! 這里輸入的姓名是指 青年之聲用戶名 !!!
如果用戶名與真實姓名不一致 請輸入 青年之聲用戶名 !!!
程序會根據 輸入的用戶名進行匹配 !!!
輸入不匹配就不會輸出 合格 !!!
請務必檢查清楚 !!!
最后就是 templete.xls 了
其實這個文件只是獲取它的基礎板式
如果不想要這個基礎板式,可以去掉配置文件的索引。
這樣子生成的就是配置文件部分的 Excel 文檔
代碼分析,源代碼這個部分與軟件使用無關,只是個人總結一下代碼編寫的過程。
下面貼出軟件的源碼
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
import re
import xlwt
import xlrd
import xlutils.copy
import requests
import time
import os
import traceback
class Downloader(QDialog):
def __init__(self):
QDialog.__init__(self)
# 創建窗口
self.resize(750,300)
layout = QGridLayout()
self.infoTitle = QLabel('
數據獲取設置')self.title = QLabel('
輸入網頁URL')self.url = QPlainTextEdit()
self.save_location = QLineEdit()
self.DB_location = QLineEdit()
self.templete_location = QLineEdit()
self.progress = QProgressBar()
download = QPushButton('一鍵統計')
browse = QPushButton('選擇')
DB_browse = QPushButton('選擇')
templete_browse = QPushButton('選擇')
self.save_location.setPlaceholderText('文件保存路徑')
self.DB_location.setPlaceholderText('青年之聲用戶名信息存儲文本')
self.templete_location.setPlaceholderText('Excel模板文件')
self.progress.setValue(0)
self.progress.setAlignment(Qt.AlignHCenter)
num = 1
layout.addWidget(self.infoTitle,num-1,0,1,4)
layout.addWidget(self.DB_location,num,0,1,3)
layout.addWidget(DB_browse,num,3,1,1)
layout.addWidget(self.templete_location,num 1,0,1,3)
layout.addWidget(templete_browse,num 1,3,1,1)
layout.addWidget(self.title,num 2,0,1,4)
layout.addWidget(self.url,num 3,0,1,4)
layout.addWidget(self.save_location,num 4,0,1,3)
layout.addWidget(browse,num 4,3,1,1)
layout.addWidget(self.progress,num 5,0,1,4)
layout.addWidget(download,num 6,0,1,4)
self.setLayout(layout)
self.setWindowTitle('青年之聲統計神器 - 制作者:16級數字媒體技術2班梁偉添')
self.DB_location.setText('data.txt')
self.templete_location.setText('templete.xls')
self.setFocus()
download.clicked.connect(self.download)
browse.clicked.connect(self.browse_file)
DB_browse.clicked.connect(self.browse_DB)
templete_browse.clicked.connect(self.browse_templete)
def browse_file(self):
save_file = QFileDialog.getSaveFileName(self, caption='保存文件到', directory='.',filter='Excel (*.xls)')
self.save_location.setText(QDir.toNativeSeparators(save_file))
def browse_DB(self):
DB_file = QFileDialog.getOpenFileNames(self, caption='獲取青年之聲用戶名信息', directory='.',filter='txt (*.txt)')
# 空數組處理
if not DB_file:
return
self.DB_location.setText(QDir.toNativeSeparators(DB_file[0]))
def browse_templete(self):
templete_file = QFileDialog.getOpenFileNames(self, caption='獲取模板Excel文件', directory='.',filter='Excel (*.xls)')
# 空數組處理
if not templete_file:
return
self.templete_location.setText(QDir.toNativeSeparators(templete_file[0]))
def download(self):
url = self.url.toPlainText()
save_location = self.save_location.text()
DB_location = self.DB_location.text()
templete_location = self.templete_location.text()
print('開始寫入')
if DB_location == '':
QMessageBox.warning(self, 'Warning', '用戶數據不能為空')
return
try:
with open(DB_location,'r') as f:
info = f.read()
except Exception:
QMessageBox.warning(self, 'Warning', '青年之聲用戶名信息獲取失敗\n檢查文件路徑是否正確')
return
reg = r'(.*)'
studentReg = re.compile(reg)
self.studentName = re.findall(studentReg,info)
# 清除空字符串
self.studentName = [x for x in self.studentName if x != '']
# 遍歷獲取 url 輸入框中的所有鏈接
reg = r'(http.*)'
urldReg = re.compile(reg)
urlList = re.findall(urldReg,url)
# 創建 excel 對象 和 excel 表
if templete_location != '':
try:
rb = xlrd.open_workbook(templete_location,formatting_info=True)
book = xlutils.copy.copy(rb)
sheet = book.get_sheet(0)
except Exception:
QMessageBox.warning(self, 'Warning', 'Excel模板獲取失敗\n檢查文件路徑是否正確')
return
else:
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('青年之聲統計', cell_overwrite_ok=True)
# 設置字體樣式
font0 = xlwt.Font()
font0.name = '微軟雅黑'
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER
style0 = xlwt.XFStyle()
style0.font = font0
style0.alignment = alignment
try:
az = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
column = 4
r = 0
for name in self.studentName:
userClass = name.split('\t')[0]
userNum = name.split('\t')[1]
userName = name.split('\t')[2]
sheet.write(r 2, 0, r 1 ,style0)
sheet.write(r 2, 1, userClass ,style0)
sheet.write(r 2, 2, userNum ,style0)
sheet.write(r 2, 3, userName ,style0)
r = 1
# 分離處理 url 鏈接
for originUrl in urlList:
# 獲取url
reg = r'quId=(.*?)&'
quIdReg = re.compile(reg)
quId = re.findall(quIdReg,originUrl)[0]
url = 'https://api.12355.net/pc/service/getReplysByQuestionId?quId=%s&page=1&rows=500' % quId
askUrl = 'https://api.12355.net/pc/service/getQuesDetail?quId=%s' % quId
try:
# 獲取html頁面
response = requests.get(url)
html = response.text
response = requests.get(askUrl)
askHtml = response.text
except Exception:
traceback.print_exc()
QMessageBox.warning(self, 'Warning', '網絡連接失敗')
return
if html == '':
break
# 獲取提問時間
reg = r''askTime':'(.*?)''
askReg = re.compile(reg)
askList = re.findall(askReg,askHtml)
# 獲取用戶名
reg = r''creatorName':'(.*?)''
nameReg = re.compile(reg)
nameList = re.findall(nameReg,html)
# 獲取回復信息
reg = r''replyContent':'(.*?)''
contentReg = re.compile(reg)
contentList = re.findall(contentReg,html)
# 獲取回復時間
reg = r''replyTime':'(.*?)''
timeReg = re.compile(reg)
timeList = re.findall(timeReg,html)
row = 0
# 批量生成超鏈接
sheet.write(1, column, xlwt.Formula('HYPERLINK('%s';'問題%s')' % (originUrl,column-3)),style0)
for name in self.studentName:
index = 0
# 檢測回復是否符合條件
for creatorName in nameList:
# 檢測回復是否匹配 用戶名
if name.split('\t')[2] == creatorName:
# 檢測是否是問題當天的時間進行回復
if askList[0].split(' ')[0] == timeList[index].split(' ')[0]:
# 去除標點 檢測回復是否超過5個字
reg = r'(?u)\w'
textReg = re.compile(reg)
textList = re.findall(textReg,contentList[index])
if len(textList) >= 5:
sheet.write(row 2, column , '合格' ,style0)
break
index = 1
row = 1
# 進度條加載
percent = (column-3) * 100 / len(urlList)
self.progress.setValue(int(percent))
print(str(int(percent)) '%')
# 縱向求和 判斷數組是否越界的情況
if column < 26:
sheet.write(row 2, column , xlwt.Formula('COUNTIF(%s3:%s%s,\'合格\')' % (az[column],az[column],row 2)) ,style0)
else:
letter = '%s%s' % (az[int(column/26-1)],az[column%26])
sheet.write(row 2, column , xlwt.Formula('COUNTIF(%s3:%s%s,\'合格\')' % (letter,letter,row 2)) ,style0)
column = 1
# 橫向求和
r = 0
column -= 1
sheet.write(r 1, column 1 , '合計' ,style0)
# 判斷數組是否越界的情況
if column < 26:
for name in self.studentName:
sheet.write(r 2, column 1 , xlwt.Formula('COUNTIF(%s%s:%s%s,\'合格\')' % (az[4],r 3,az[column],r 3)) ,style0)
r = 1
sheet.write(r 2, column 1 , xlwt.Formula('SUM(%s%s:%s%s)' % (az[4],r 3,az[column],r 3)) ,style0)
else:
letter = '%s%s' % (az[int(column/26-1)],az[column%26])
for name in self.studentName:
sheet.write(r 2, column 1 , xlwt.Formula('COUNTIF(%s%s:%s%s,\'合格\')' % (az[4],r 3,letter,r 3)) ,style0)
r = 1
sheet.write(r 2, column 1 , xlwt.Formula('SUM(%s%s:%s%s)' % (az[4],r 3,letter,r 3)) ,style0)
book.save(save_location)
except Exception:
traceback.print_exc()
QMessageBox.warning(self, 'Warning', '數據寫入失敗')
return
print('完成寫入')
QMessageBox.information(self, 'Information', '數據寫入完成')
self.progress.setValue(0)
# # 清空輸入
# self.url.setText('')
# self.save_location.setText('')
app = QApplication(sys.argv)
dl = Downloader()
dl.show()
app.exec_()
總結Python開發比起C 簡單很多,想起C 的MFC框架就很難受。
總結
以上是生活随笔為你收集整理的qpython编写爬虫_Python - 用 PyQt 写爬虫界面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 表格大小设置_系统地学习Excel第18
- 下一篇: 轨迹匹配地图 python_基于地图的视