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.textdb = 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 = 0for t in item.split(','):if re.match("[a-zA-Z]+", t):continuenewItem = QTableWidgetItem(t)if j >= 5:if t != '':newItem = QTableWidgetItem(t + '%')  # 3-13else: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('(.*?)\((.*?)',str(bs.select('.fundDetail-tit')[0]))[0][0])s.append(re.findall('\((.*?)\)', 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("成立来:(.*?)", 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的可视化界面设计,发现到自己动手实践才是学习编程效率最快的一种方式,而且最后还要做一个总结,这样才有收获,将知识真正地吸收。

最后自己动手做满足自己需求的工具而不是去用别人的感觉是真的不错!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部