爬蟲實戰項目------爬取天天基金
功能展示
Python爬蟲實戰項目------爬取天天基金

技術
- 語言:python
- Beautifulsoup解析html
- js2py解析JavaScript
- python 爬蟲
- 正規表達式提取資料
- 界面設計用的PyQt5
功能片段
僞裝頭
# headers
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36',
'Referer': 'http://fund.eastmoney.com/data/fundranking.html',
}
爬取天天基金排行榜資料
# 爬取排行榜基金資料
def getRankDatas():
url = "http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft=all&rs=&gs=0&sc=6yzf&st=desc&sd=2020-08-15&ed=2021-08-15&qdii=&tabSubtype=,,,,,&pi=1&pn=50&dx=1&v=0.6075346553325671"
req = requests.get(url=url, headers=headers)
datas = req.text
db = js2py.eval_js(datas)#資料是JavaScript,要用js2py解析器解析
data = db['datas']
return data
搜尋功能實作
# 搜尋基金資料
def searchData(text):
url = "http://fund.eastmoney.com/" + str(text) + ".html"
req = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(req)
bs = BeautifulSoup(response, "html.parser")#資料是HTML,要用BeautifulSoup解析器解析
return bs
根據文本框内容爬取相應的基金資訊頁面,提取的是html中的資料
界面設計
class Table(QWidget):
def __init__(self):
super(Table, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("基金資料測試")
# self.resize(1900, 900)
self.resize(1000, 600)
# 設定按鈕
button = QPushButton()
button.setText('排行榜')
button.clicked.connect(lambda: self.setRankList(TableWidget))
# 設定搜尋框
searchEdit = QLineEdit()
searchEdit.setPlaceholderText("輸入基金代碼")
# 設定搜尋框按鈕
searchButton = QPushButton()
searchButton.setText('搜尋')
searchButton.clicked.connect(lambda: self.setSearchList(TableWidget, searchEdit.text()))
# 設定布局
layout = QGridLayout()
layout.setSpacing(10)
# 實作的效果是一樣的,四行三列,是以要靈活運用函數,這裡隻是示範一下如何單獨設定行列
TableWidget = QTableWidget(0, 15)
# 設定水準方向的表頭标簽與垂直方向上的表頭标簽,注意必須在初始化行列之後進行,否則,沒有效果
TableWidget.setHorizontalHeaderLabels(['基金代碼', '基金簡稱', '日期', '機關淨值', '累計淨值', '日增長率', '近1周', '近1月',
'近3月', '近6月', '近1年', '近2年', '近3年', '今年來', '成立來'])
# 設定不可編輯狀态
TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
# 視窗自适應
layout.addWidget(TableWidget)
layout.addWidget(searchEdit)
layout.addWidget(searchButton)
layout.addWidget(button)
self.setLayout(layout)
主界面用的是QTableWidget表格,其他控件都是PYQT5中的小控件
主方法
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Table()
win.show()
sys.exit(app.exec_())
填充資料
# 填充資料
def insertData(TableWidget, data):
print(data)
clearRow(TableWidget)
for i, item in enumerate(data):
TableWidget.insertRow(int(TableWidget.rowCount()))
j = 0
for t in item.split(','):
if re.match("[a-zA-Z]+", t):
continue
newItem = QTableWidgetItem(t)
if j >= 5:
if t != '':
newItem = QTableWidgetItem(t + '%') # 3-13
else:
newItem = QTableWidgetItem('---')
newItem.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
if j >= 3:
if re.match("^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$", t):
newItem.setForeground(Qt.red)
elif re.match("^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$",
t):
newItem.setForeground(Qt.darkGreen)
else:
newItem.setForeground(Qt.gray)
TableWidget.setItem(i, j, newItem)
j += 1
運用正規表達式比對資料是否為正負浮點數,正的則渲染為紅色,負的則渲染為深綠色,0.00或無資料都是灰色
提取搜尋資料内容
# 設定搜尋資料
def setSearchList(self, TableWidget, text):
bs = searchData(text)
s = []
s.append(text)
s.append(re.findall('<div style="float: left">(.*?)<span>\(</span><span class="ui-num">(.*?)</span></div>',
str(bs.select('.fundDetail-tit')[0]))[0][0])
s.append(re.findall('\(</span>(.*?)\)', str(bs.select('.dataItem02>dt>p')))[0])
s.append(bs.select('.dataNums')[1].findAll("span")[0].text)
s.append(bs.select('.dataNums')[2].text)
s.append(bs.select('.dataNums')[1].findAll("span")[1].text[:-1])
for item in range(10, 18):
s.append(bs.select('.ui-table-hover')[6].findAll('div')[item].text[:-1])
s.append(
re.findall(">(.*?)<", re.findall("成立來:</span>(.*?)</dd></dl>", str(bs.select('.dataItem03')))[0])[0][:-1])
temp = ','.join(s)
s.clear()
s.append(temp)
#淨值估算
db = searchPreData(text)
temp=','
temp+='淨值估算:,'
temp+=db['gztime']+','
temp+=db['gszzl']
s.append(temp)
print(s)
insertData(TableWidget, s)
TableWidget.resizeColumnsToContents()
巧妙使用re正規表達式,提取出關鍵資料并填充到表格中
總結
這是第一次自己動手做友善的小工具,學習了Beautifulsoup和js2py等優秀的爬蟲工具,還學習了PYQT5的可視化界面設計,發現到自己動手實踐才是學習程式設計效率最快的一種方式,而且最後還要做一個總結,這樣才有收獲,将知識真正地吸收。
最後自己動手做滿足自己需求的工具而不是去用别人的感覺是真的不錯!