热搜榜的标签分为“热”和“荐”,都在标签
热搜榜的搜索量在标签中;
之后,根据以上分析,我完成了微博热搜部分的爬取和解析。
def search_hot():
"""
功能:定义函数爬取微博热搜榜信息,并返回元组的列表
"""
url = 'https://s.weibo.com/top/summary/summary?cate=realtimehot'
# 将爬虫伪装成浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.44"}
wb_data = requests.get(url, headers=headers)
wb_data.encoding = "utf-8"
soup = BeautifulSoup(wb_data.content, 'lxml')
# 创立空列表 把热搜序号数据填入
id = soup.find_all("td", class_='td-01')
num = []
for i in id:
if i.text == '':
num.append("置顶")
else:
num.append(i.text)
# 创立空列表 把热搜内容填入
hot = soup.find_all("td", class_='td-02')
name = []
for x in hot:
name.append(x.a.text)
# 把对应网址保存
del address_hot[:] # 保证列表中无上一次查询的记录
pattern = r'/weibo?'
for z in soup.find_all('a'):
link = z.get('href')
if re.match(pattern, link):
address_hot.append("https://s.weibo.com" + link)
else:
link = z.get('href_to')
if link and re.match(pattern, link):
address_hot.append("https://s.weibo.com" + link)
# 创立空列表 把热搜标签数据填入
rank = []
top = soup.find_all("td", class_='td-03')
for y in top:
rank.append(y.text)
# 爬取搜索量
total = ['']
for k in soup.find_all('span'):
total.append(k.text)
result = list(zip(num, name, rank, total))
return result
随后,按照同样的方法,我分析得出微博要闻榜中的内容都保存在
def search_news():
"""
功能:爬取微博要闻榜
"""
url = 'https://s.weibo.com/top/summary/summary?cate=socialevent'
# 将爬虫伪装成浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.44"}
wb_data = requests.get(url, headers=headers)
wb_data.encoding = "utf-8"
soup = BeautifulSoup(wb_data.content, 'lxml')
del address_news[:] # 保证列表中无上一次查询的记录
pattern = r'/weibo?'
for z in soup.find_all('a'):
link = z.get('href')
if re.match(pattern, link):
address_news.append("https://s.weibo.com" + link)
else:
link = z.get('href_to')
if link and re.match(pattern, link):
address_news.append("https://s.weibo.com" + link)
result = []
news = soup.find_all("td", class_='td-02')
for i in news:
result.append(i.a.text)
return result
接下来,观察到在热搜榜的最上端会显示“实时热点,更新于2020-6-10 15:00:00”,通过分析元素的方法发现它位于
标签中,据此,爬取最后更新的时间。
def UpdateTime():
"""
功能:爬取最后更新的时间
"""
# 筛选数据最后一次的更新时间
url = 'https://s.weibo.com/top/summary/summary?cate=realtimehot'
# 将爬虫伪装成浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.44"}
wb_data = requests.get(url, headers=headers)
wb_data.encoding = "utf-8"
soup = BeautifulSoup(wb_data.content, 'lxml')
p = soup.find_all("p", style="color:#999;margin:0 0 10px 28px")
update = p[0].text
return update
最后,为了能够实现点击指定按钮弹出对应的网页内容,我定义了三个函数,完成了爬虫模块的编写。
def search_hot_link(num):
"""
功能:返回对应序号的热搜链接
"""
return address_hot[num]
def search_news_link(num):
"""
功能:返回对应的要闻链接
"""
return address_news[num]
def openbrowser(a):
"""
功能:打开指定外部链接
"""
webbrowser.open(a)
Ex4_func.py 完整代码(码云直达):
from bs4 import BeautifulSoup
import requests
import webbrowser # 该库主要用于实现在默认浏览器中打开指定链接的功能
import re
address_hot = []
address_news = []
def search_hot():
"""
功能:定义函数爬取微博热搜榜信息,并返回元组的列表
"""
url = 'https://s.weibo.com/top/summary/summary?cate=realtimehot'
# 将爬虫伪装成浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.44"}
wb_data = requests.get(url, headers=headers)
wb_data.encoding = "utf-8"
soup = BeautifulSoup(wb_data.content, 'lxml')
# 创立空列表 把热搜序号数据填入
id = soup.find_all("td", class_='td-01')
num = []
for i in id:
if i.text == '':
num.append("置顶")
else:
num.append(i.text)
# 创立空列表 把热搜内容填入
hot = soup.find_all("td", class_='td-02')
name = []
for x in hot:
name.append(x.a.text)
# 把对应网址保存
del address_hot[:] # 保证列表中无上一次查询的记录
pattern = r'/weibo?'
for z in soup.find_all('a'):
link = z.get('href')
if re.match(pattern, link):
address_hot.append("https://s.weibo.com" + link)
else:
link = z.get('href_to')
if link and re.match(pattern, link):
address_hot.append("https://s.weibo.com" + link)
# 创立空列表 把热搜标签数据填入
rank = []
top = soup.find_all("td", class_='td-03')
for y in top:
rank.append(y.text)
# 爬取搜索量
total = ['']
for k in soup.find_all('span'):
total.append(k.text)
result = list(zip(num, name, rank, total))
return result
def search_news():
"""
功能:爬取微博要闻榜
"""
url = 'https://s.weibo.com/top/summary/summary?cate=socialevent'
# 将爬虫伪装成浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.44"}
wb_data = requests.get(url, headers=headers)
wb_data.encoding = "utf-8"
soup = BeautifulSoup(wb_data.content, 'lxml')
del address_news[:] # 保证列表中无上一次查询的记录
pattern = r'/weibo?'
for z in soup.find_all('a'):
link = z.get('href')
if re.match(pattern, link):
address_news.append("https://s.weibo.com" + link)
else:
link = z.get('href_to')
if link and re.match(pattern, link):
address_news.append("https://s.weibo.com" + link)
result = []
news = soup.find_all("td", class_='td-02')
for i in news:
result.append(i.a.text)
return result
def UpdateTime():
"""
功能:爬取最后更新的时间
"""
# 筛选数据最后一次的更新时间
url = 'https://s.weibo.com/top/summary/summary?cate=realtimehot'
# 将爬虫伪装成浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.44"}
wb_data = requests.get(url, headers=headers)
wb_data.encoding = "utf-8"
soup = BeautifulSoup(wb_data.content, 'lxml')
p = soup.find_all("p", style="color:#999;margin:0 0 10px 28px")
update = p[0].text
return update
def search_hot_link(num):
"""
功能:返回对应序号的热搜链接
"""
return address_hot[num]
def search_news_link(num):
"""
功能:返回对应的要闻链接
"""
return address_news[num]
def openbrowser(a):
"""
功能:打开指定外部链接
"""
webbrowser.open(a)
接下来是GUI部分,也是主函数部分(可以说这一部分也是耗时最长的一部分)。
首先,我打开配置好的Qt Designer,按照云班课上的教程完成了主窗体的设计,保存为Experiment4.ui。
之后,使用配置好的PyUIC生成了对应的python文件,如图。
生成代码如下:
1# -*- coding: utf-8 -*-
2
3# Form implementation generated from reading ui file 'Experiment4.ui'
4#
5# Created by: PyQt5 UI code generator 5.15.0
6#
7# WARNING: Any manual changes made to this file will be lost when pyuic5 is
8# run again. Do not edit this file unless you know what you are doing.
9
10
11from PyQt5 import QtCore, QtGui, QtWidgets
12
13
14class Ui_MainWindow(object):
15 def setupUi(self, MainWindow):
16 MainWindow.setObjectName("MainWindow")
17 MainWindow.resize(960, 900)
18 MainWindow.setMinimumSize(QtCore.QSize(960, 900))
19 MainWindow.setMaximumSize(QtCore.QSize(960, 900))
20 self.centralwidget = QtWidgets.QWidget(MainWindow)
21 self.centralwidget.setObjectName("centralwidget")
22 self.widget_query = QtWidgets.QWidget(self.centralwidget)
23 self.widget_query.setGeometry(QtCore.QRect(0, 0, 960, 80))
24 self.widget_query.setObjectName("widget_query")
25 self.pushButton_hot = QtWidgets.QPushButton(self.widget_query)
26 self.pushButton_hot.setGeometry(QtCore.QRect(280, 26, 200, 28))
27 self.pushButton_hot.setObjectName("pushButton_hot")
28 self.label_img = QtWidgets.QLabel(self.widget_query)
29 self.label_img.setGeometry(QtCore.QRect(100, 26, 80, 27))
30 self.label_img.setStyleSheet("")
31 self.label_img.setText("")
32 self.label_img.setPixmap(QtGui.QPixmap("WB_logo.png"))
33 self.label_img.setObjectName("label_img")
34 self.pushButton_news = QtWidgets.QPushButton(self.widget_query)
35 self.pushButton_news.setGeometry(QtCore.QRect(600, 26, 200, 28))
36 self.pushButton_news.setObjectName("pushButton_news")
37 self.label_time = QtWidgets.QLabel(self.centralwidget)
38 self.label_time.setGeometry(QtCore.QRect(50, 84, 900, 20))
39 font = QtGui.QFont()
40 font.setFamily("微软雅黑 Light")
41 self.label_time.setFont(font)
42 self.label_time.setText("")
43 self.label_time.setObjectName("label_time")
44 self.label_note = QtWidgets.QLabel(self.centralwidget)
45 self.label_note.setGeometry(QtCore.QRect(660, 84, 260, 20))
46 font = QtGui.QFont()
47 font.setFamily("微软雅黑 Light")
48 self.label_note.setFont(font)
49 self.label_note.setObjectName("label_note")
50 self.tableView_result = QtWidgets.QTableView(self.centralwidget)
51 self.tableView_result.setGeometry(QtCore.QRect(30, 110, 900, 750))
52 self.tableView_result.setObjectName("tableView")
53 MainWindow.setCentralWidget(self.centralwidget)
54 self.statusbar = QtWidgets.QStatusBar(MainWindow)
55 self.statusbar.setObjectName("statusbar")
56 MainWindow.setStatusBar(self.statusbar)
57
58 self.retranslateUi(MainWindow)
59 QtCore.QMetaObject.connectSlotsByName(MainWindow)
60
61 def retranslateUi(self, MainWindow):
62 _translate = QtCore.QCoreApplication.translate
63 MainWindow.setWindowTitle(_translate("MainWindow", "微博热搜"))
64 self.pushButton_hot.setText(_translate("MainWindow", "热搜榜"))
65 self.pushButton_news.setText(_translate("MainWindow", "要闻榜"))
66 self.label_note.setText(_translate("MainWindow", "提示:双击具体标题可跳转至浏览器"))
需要注意的是,此时的代码仅仅是一个基本框架,仍需要添加代码使其具有完整功能。
在添加代码部分,首先我在12行的位置补充导入了模块,代码如下:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from Ex4_func import * # 导入爬虫函数
接下来,为了使得最后程序打包后能够正常显示图片,我将32行的图片路径改为绝对路径。
32 self.label_img.setPixmap(QtGui.QPixmap("D:\\网空专业\\大一下\\Python程序设计\\Learnpython\\Experiment\\Experiment4\\WB_logo.png")) # 设置微博logo
在42行的位置,我调用了爬虫模块中的UpdateTime()函数以获取最后更新的时间并使其显示在label_time控件上。
self.label_time.setText("{}".format(UpdateTime()))
在43行与44行之间,我添加了一行代码来设置label_time字体的颜色
self.label_time.setStyleSheet("color:#999") # 设置字体颜色
删除了46行、47行的冗余代码
在49行、50行之间添加一行代码设置label_note字体的颜色
self.label_note.setStyleSheet("color:#999") # 设置字体颜色
在52行、53行之间添加代码详细设置tableView_result控件的属性,主要包括设置大小不可改变、纵向表头不可见、表格内文字大小、设置表格内容不可编辑以及垂直滚动条始终开启。
self.tableView_result.setMinimumSize(QtCore.QSize(900, 750))
self.tableView_result.setMaximumSize(QtCore.QSize(900, 750))
self.model = QStandardItemModel()
# 纵向表头不可见
self.tableView_result.verticalHeader().setVisible(False)
# 设置表格内容文字大小
font = QtGui.QFont()
font.setPointSize(10)
self.tableView_result.setFont(font)
# 设置表格内容不可编辑
self.tableView_result.setEditTriggers(QAbstractItemView.NoEditTriggers)
# 垂直滚动条始终开启
self.tableView_result.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
在55行、56行之间添加代码绑定pushButton_hot、pushButton_news的单击事件,使得在单击按钮时显示对应的排行榜。
self.pushButton_hot.clicked.connect(lambda: self.PushHot()) # 绑定pushButton_hot按钮的单机事件
self.pushButton_news.clicked.connect(lambda: self.PushNews()) # 绑定pushButton_news按钮的单机事件
之后,在下方定义方法DisplayTable1()来展示爬取到的热搜,定义DisplayTable2()来展示爬取到的要闻。
def DisplayTable1(self, row, column, data):
# 功能:让tableView_result控件展示爬取的热搜
self.model.clear()
for a in range(row):
for b in range(column):
# 添加表格内容
item = QStandardItem(data[a][b])
item.setTextAlignment(Qt.AlignCenter)
# 向表格存储模式中添加表格具体信息
self.model.setItem(a, b, item)
# 设置表格存储数据的模式
self.tableView_result.setModel(self.model)
def DisplayTable2(self, row, data):
# 功能:让tableView_result控件展示爬取的要闻
self.model.clear()
for a in range(row):
# 添加表格内容
item = QStandardItem(data[a])
item.setTextAlignment(Qt.AlignCenter)
id = QStandardItem("{}".format(a + 1))
id.setTextAlignment(Qt.AlignCenter)
# 向表格存储模式中添加表格具体信息
self.model.setItem(a, 0, id)
self.model.setItem(a, 1, item)
# 设置表格存储数据的模式
self.tableView_result.setModel(self.model)
然后再定义上文中单击事件绑定的PushHot()、PushNews()方法,在其中设置表头、列宽并绑定tableView_result的双击事件,使用try……except语句来防止绑定多次。
def PushHot(self):
result_h = search_hot()
self.DisplayTable1(len(result_h), len(result_h[0]), result_h)
self.model.setHorizontalHeaderLabels(['序号', '内容', '标签', '热度'])
self.tableView_result.setColumnWidth(0, 50)
self.tableView_result.setColumnWidth(1, 670)
self.tableView_result.setColumnWidth(2, 50)
self.tableView_result.setColumnWidth(3, 100)
try:
self.tableView_result.doubleClicked.disconnect() # 防止将self.table_openhotlink()绑定多次
except:
pass
self.tableView_result.doubleClicked.connect(lambda: self.table_openhotlink()) # 绑定tableView_result的双击事件
def PushNews(self):
result_n = search_news()
self.DisplayTable2(len(result_n), result_n)
self.model.setHorizontalHeaderLabels(['序号', '内容'])
self.tableView_result.setColumnWidth(0, 50)
self.tableView_result.setColumnWidth(1, 820)
try:
self.tableView_result.doubleClicked.disconnect() # 防止将self.table_opennewslink()绑定多次
except:
pass
self.tableView_result.doubleClicked.connect(lambda: self.table_opennewslink()) # 绑定tableView_result的双击事件
接下来定义上文中双击事件绑定的方法table_openhotlink()、table_opennewslink(),使得在双击列表中的热搜内容时打开浏览器并定位到对应的网页,在这里调用了openbrowser()函数。
def table_openhotlink(self):
# 功能:根据tableView_result中双击的位置打开对应的热搜链接
row = self.tableView_result.currentIndex().row()
link = search_hot_link(row)
openbrowser(link)
def table_opennewslink(self):
# 功能:根据tableView_result中双击的位置打开对应的要闻链接
row = self.tableView_result.currentIndex().row()
link = search_news_link(row)
openbrowser(link)
最终,定义函数显示主窗体,并定义程序入口,完成了主函数的部分,实现了全部的功能。
def show_MainWindow():
"""
功能:显示主窗体
"""
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.setWindowIcon(QIcon("D:\\网空专业\\大一下\\Python程序设计\\Learnpython\\Experiment\\Experiment4\\icon_wb.ico")) # 设置程序图标
MainWindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
# 程序入口
show_MainWindow()
Experiment4.py 完整代码(码云直达):
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Experiment4.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from Ex4_func import * # 导入爬虫函数
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(960, 900)
MainWindow.setMinimumSize(QtCore.QSize(960, 900))
MainWindow.setMaximumSize(QtCore.QSize(960, 900))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.widget_query = QtWidgets.QWidget(self.centralwidget)
self.widget_query.setGeometry(QtCore.QRect(0, 0, 960, 80))
self.widget_query.setObjectName("widget_query")
self.pushButton_hot = QtWidgets.QPushButton(self.widget_query)
self.pushButton_hot.setGeometry(QtCore.QRect(280, 26, 200, 28))
self.pushButton_hot.setObjectName("pushButton_hot")
self.label_img = QtWidgets.QLabel(self.widget_query)
self.label_img.setGeometry(QtCore.QRect(100, 26, 80, 27))
self.label_img.setStyleSheet("")
self.label_img.setText("")
self.label_img.setPixmap(QtGui.QPixmap("D:\\网空专业\\大一下\\Python程序设计\\Learnpython\\Experiment\\Experiment4\\WB_logo.png")) # 设置微博logo
self.label_img.setObjectName("label_img")
self.pushButton_news = QtWidgets.QPushButton(self.widget_query)
self.pushButton_news.setGeometry(QtCore.QRect(600, 26, 200, 28))
self.pushButton_news.setObjectName("pushButton_news")
self.label_time = QtWidgets.QLabel(self.centralwidget)
self.label_time.setGeometry(QtCore.QRect(50, 84, 900, 20))
font = QtGui.QFont() # 设置字体
font.setFamily("微软雅黑 Light")
self.label_time.setFont(font)
self.label_time.setText("{}".format(UpdateTime()))
self.label_time.setObjectName("label_time")
self.label_time.setStyleSheet("color:#999") # 设置字体颜色
self.label_note = QtWidgets.QLabel(self.centralwidget)
self.label_note.setGeometry(QtCore.QRect(660, 84, 260, 20))
self.label_note.setFont(font)
self.label_note.setObjectName("label_note")
self.label_note.setStyleSheet("color:#999") # 设置字体颜色
self.tableView_result = QtWidgets.QTableView(self.centralwidget)
self.tableView_result.setGeometry(QtCore.QRect(30, 110, 900, 750))
self.tableView_result.setMinimumSize(QtCore.QSize(900, 750))
self.tableView_result.setMaximumSize(QtCore.QSize(900, 750))
self.tableView_result.setObjectName("tableView")
self.model = QStandardItemModel()
# 纵向表头不可见
self.tableView_result.verticalHeader().setVisible(False)
# 设置表格内容文字大小
font = QtGui.QFont()
font.setPointSize(10)
self.tableView_result.setFont(font)
# 设置表格内容不可编辑
self.tableView_result.setEditTriggers(QAbstractItemView.NoEditTriggers)
# 垂直滚动条始终开启
self.tableView_result.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
self.pushButton_hot.clicked.connect(lambda: self.PushHot()) # 绑定pushButton_hot按钮的单机事件
self.pushButton_news.clicked.connect(lambda: self.PushNews()) # 绑定pushButton_news按钮的单机事件
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "微博热搜"))
self.pushButton_hot.setText(_translate("MainWindow", "热搜榜"))
self.pushButton_news.setText(_translate("MainWindow", "要闻榜"))
self.label_note.setText(_translate("MainWindow", "提示:双击具体标题可跳转至浏览器"))
def DisplayTable1(self, row, column, data):
# 功能:让tableView_result控件展示爬取的热搜
self.model.clear()
for a in range(row):
for b in range(column):
# 添加表格内容
item = QStandardItem(data[a][b])
item.setTextAlignment(Qt.AlignCenter)
# 向表格存储模式中添加表格具体信息
self.model.setItem(a, b, item)
# 设置表格存储数据的模式
self.tableView_result.setModel(self.model)
def DisplayTable2(self, row, data):
# 功能:让tableView_result控件展示爬取的要闻
self.model.clear()
for a in range(row):
# 添加表格内容
item = QStandardItem(data[a])
item.setTextAlignment(Qt.AlignCenter)
id = QStandardItem("{}".format(a + 1))
id.setTextAlignment(Qt.AlignCenter)
# 向表格存储模式中添加表格具体信息
self.model.setItem(a, 0, id)
self.model.setItem(a, 1, item)
# 设置表格存储数据的模式
self.tableView_result.setModel(self.model)
def PushHot(self):
result_h = search_hot()
self.DisplayTable1(len(result_h), len(result_h[0]), result_h)
self.model.setHorizontalHeaderLabels(['序号', '内容', '标签', '热度'])
self.tableView_result.setColumnWidth(0, 50)
self.tableView_result.setColumnWidth(1, 670)
self.tableView_result.setColumnWidth(2, 50)
self.tableView_result.setColumnWidth(3, 100)
try:
self.tableView_result.doubleClicked.disconnect() # 防止将self.table_openhotlink()绑定多次
except:
pass
self.tableView_result.doubleClicked.connect(lambda: self.table_openhotlink()) # 绑定tableView_result的双击事件
def PushNews(self):
result_n = search_news()
self.DisplayTable2(len(result_n), result_n)
self.model.setHorizontalHeaderLabels(['序号', '内容'])
self.tableView_result.setColumnWidth(0, 50)
self.tableView_result.setColumnWidth(1, 820)
try:
self.tableView_result.doubleClicked.disconnect() # 防止将self.table_opennewslink()绑定多次
except:
pass
self.tableView_result.doubleClicked.connect(lambda: self.table_opennewslink()) # 绑定tableView_result的双击事件
def table_openhotlink(self):
# 功能:根据tableView_result中双击的位置打开对应的热搜链接
row = self.tableView_result.currentIndex().row()
link = search_hot_link(row)
openbrowser(link)
def table_opennewslink(self):
# 功能:根据tableView_result中双击的位置打开对应的要闻链接
row = self.tableView_result.currentIndex().row()
link = search_news_link(row)
openbrowser(link)
def show_MainWindow():
"""
功能:显示主窗体
"""
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.setWindowIcon(QIcon("D:\\网空专业\\大一下\\Python程序设计\\Learnpython\\Experiment\\Experiment4\\icon_wb.ico")) # 设置程序图标
MainWindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
# 程序入口
show_MainWindow()
最后使用pyinstaller打包生成exe文件,以便之后的运行。
pyinstaller -i icon_wb.ico -Fw Experiment4.py -p D:/网空专业/大一下/Python程序设计/Learnpython/Experiment/Experiment4/Ex4_func.py -p D:/Python3/Lib/site-packages/PyQt5/Qt/bin -p D:/Python3/Lib/site-packages -p D:/Python3/Lib
打包截图如下:
实验结果:
图1 刚进入程序时的界面
图2 热搜榜界面
3. 实验过程中遇到的问题和解决过程
问题1:爬取界面上的元素时无从下手
问题1解决方案:仔细观察网页源代码,并从中定位相应数据所在标签,使用bs4中的find_all方法来查找对应的标签,从中提取数据
问题2:对于爬取到的链接无法直接打开
问题2解决方案:通过观察发现爬取的链接没有开头部分,即https://s.weibo.com,故将爬取的链接进行处理,使其拼接成一个完整的网址。
问题3:对于PyQt5的使用不是非常清楚,对于绑定事件、设置字体属性等问题无法解决
问题3解决方案:查阅博客等各种资料,查看官方文档,最终通过PyQt5中的方法解决了这些问题
问题4:使用pyinstaller打包程序的时候生成的程序出现错误,无法打开
问题4解决方案:通过搜索了解到需要给pyinstaller指定路径,于是添加了路径参数,从而解决了该问题。
其他(感悟、思考等)
实验感想:此次的实验是整个python课程学习中综合性最强的一次,可以说挑战性非常强,与此同时,我收获的知识也非常地多,我首次了解了GUI编程的相关知识,并通过编写爬虫程序加深了我对于HTML的认识,通过此次实验,我初步掌握了从网站中获取相关信息的具体方法。此外,在GUI编程阶段有许多问题在百度里也找不到有用的信息,最后只能采取阅读官方文档并自己动手尝试的方式来解决,在此过程中,也极大地锻炼了我的英语水平以及实践能力,我突然意识到过去的依赖CSDN等博客的方式固然能够解决问题,但其中却少了一分自己的思考,长此以往便造成了思维定式,也增加了对他人的依赖,所以我应当在参考别人的同时,通过自己亲自动手实践、缜密思考来得出更好的解决问题的方法,这样才能在要求多变的编程题目中找出其中核心的不变之处,从而更加高效地解决实际问题,提高自己的编程能力。
课程总结:由于在上学期的时候接触过一部分python的知识,本学期我便选择了python程序设计这门课,希望能够更深入地了解python这门程序语言,掌握编程的本领。相比于我同时在学习的C语言来说,python具有简洁、高效的特征,使用python,你不需要关心各种函数、方法的底层实现,你所需要做的是将这些高效的工具有机地结合在一起,实现复杂的功能,可以说,python语言比C语言对新手更加友好,通过它那庞大的第三方库,几乎任何问题都能够被它所解决,虽然课程已经接近尾声,但是我会记住这些学习新知识的方法,在将来更加深入地对python进行学习。
课程感想:本学期的课采用翻转课堂加老师讲解的方式进行,这种方法十分新颖,不仅加深了我对于知识点的理解,还使我可以提出更加有价值的问题,使得时间的利用变得非常合理。在讲课过程中,王志强老师给我留下了十分深刻的印象,他很擅长和学生打成一片,并且他还很在意和学生进行互动,这样既保证了上课的效率,也营造了一种轻松愉快的学习氛围,而在作业方面,王老师要求我们今日事今日毕,使得我逐渐克服了做事拖沓的习惯,他在作业中留下的彩蛋项目也是我更加有学习python的动力,他鼓励我们在学编程的过程中每天背单词,我的英语水平也在逐渐地提高,总而言之,王志强老师是一位非常好的老师,他不仅在python方面引导我深入地学习,同时他也使我做一个更好的自己,每天都能有进步,每天都有新的收获。这段学习python的时光连同王老师对我的教导,我会始终铭记在心。
课程建议:建议老师每次课上随机抽取几个同学的作业进行点评,以便我们能够更加地完善自己的知识体系,同时也可以从别人的代码中学习一些自己未曾想到的思路,进而提高同学们的编程水平,使得解决问题的方式更加多样化。希望继续保留翻转课堂加老师讲解的教学模式。
参考资料
你可能感兴趣的:(20192426 实验四《Python程序设计》实验报告)
python 读excel每行替换_Python脚本操作Excel实现批量替换功能
weixin_39646695
python 读excel每行替换
Python脚本操作Excel实现批量替换功能大家好,给大家分享下如何使用Python脚本操作Excel实现批量替换。使用的工具Openpyxl,一个处理excel的python库,处理excel,其实针对的就是WorkBook,Sheet,Cell这三个最根本的元素~明确需求原始excel如下我们的目标是把下面excel工作表的sheet1表页A列的内容“替换我吧”批量替换为B列的“我用来替换的
自律打卡第四天:比昨天进步一点点
花儿的念想
今天新闻我们县城又确诊了一例,截止目前已经确诊的三例了,打开,看了一篇简友写的武汉的真实情况,有病住不了院,还没等到床位已经去世的消息,心里更加的难受,武汉尚且这样,如果是我们这没有高速没有火车的十八线的小县城发生这种情况,那情况将是更加的不堪设想,不敢想,唯有祈求灾难早点快去,平安才是最大的福气。突然觉得我的自律打卡,比昨天进步一点点。更希望疫情战争每一天都要比昨天好一点,希望一觉醒来听到的是好
贝多芬诞辰250周年纪念
万千星河赴远方
就算不是古典音乐爱好者,你也一定听说过贝多芬。作为古典音乐史上最伟大的音乐家之一,他不仅是古典主义风格的集大成者,同时也是浪漫主义风格的开创者。贝多芬肖像画(1813年)贝多芬的一生共创作了9部交响曲、36首钢琴奏鸣曲、10部小提琴奏鸣曲、16首弦乐四重奏、1部歌剧及2部弥撒曲等等。数量虽然不及前辈海顿、莫扎特多,但他几乎改造了当时所有的音乐表达形式,赋予了它们全新的价值,对后世音乐的发展产生了极
实时数据流计算引擎Flink和Spark剖析
程小舰
flink spark 数据库 kafka hadoop
在过去几年,业界的主流流计算引擎大多采用SparkStreaming,随着近两年Flink的快速发展,Flink的使用也越来越广泛。与此同时,Spark针对SparkStreaming的不足,也继而推出了新的流计算组件。本文旨在深入分析不同的流计算引擎的内在机制和功能特点,为流处理场景的选型提供参考。(DLab数据实验室w.x.公众号出品)一.SparkStreamingSparkStreamin
密码正则验证:大小写字母、数字、特殊字符至少8位
qq_21875331
渐进式的成长
正则表达式:密码必须包含大写字母、数字、特殊字符(四种里至少三种,且至少8位)写法一:/((^(?=.*[a-z])(?=.*[A-Z])(?=.*\W)[\da-zA-Z\W]{8,16}$)|(^(?=.*\d)(?=.*[A-Z])(?=.*\W)[\da-zA-Z\W]{8,16}$)|(^(?=.*\d)(?=.*[a-z])(?=.*\W)[\da-zA-Z\W]{8,16}$)|(^
2019-06-05
第十七把巴鲁克
今天去实验田里实习,见到了福寿螺真的可怕且牛皮,六级也快来了,说实话还是害怕。我昨天考了环工原理,真的太难了,太烦了,理工科真的难,烦。实验报告还是没写,要抓紧速度抓紧时间,还是应该学会努力学习,远离一些不上进的事物。
车载刷写架构 --- 刷写思考扩展
汽车电子实验室
电子电器架构——刷写方案 架构 开发语言 关于网关转发性能引起的思考 汽车中央控制单元HPC软件架构 车载诊断进阶篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是系统思考、大胆设计、小心求证;三是“一张纸制度”,也就是无论多么复杂的工作内容,要在一张纸上描述清楚;四是要坚决反对虎头蛇尾,反对繁文缛节,反对老
最新阿里四面面试真题46道:面试技巧+核心问题+面试心得
风平浪静如码
前言做技术的有一种资历,叫做通过了阿里的面试。这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。希望对大家帮助,祝面试成功,有个更好的职业规划。一,阿里常见技术面1、微信红包怎么实现。2、海量数据分析。3、测试职位问的线程安全和非线程安全。4、HTTP2.0、thrift。5、面试电话沟通可能先让自我介绍。6、分布式事务一致性。7、ni
不能随便扔垃圾
小猪宝贝0905
阴雨天的周五,看你生病在家窝了快一周,嚷嚷着要去游乐场,那就决定带你去四海书城;为了不让你被雨淋湿,妈妈准备推个自行车,刚把你放到自行车后座上,你一个喷嚏鼻涕出来了,随手拿出纸巾擦擦鼻涕,妈妈因为嫌把你从座位上抱下来扔纸巾到前面的垃圾桶麻烦,就将纸巾扔进了旁边的树丛里;你却批评了妈妈,“不可以把纸巾扔到地上,应该扔进垃圾桶”;妈妈顿时感觉很羞愧,将你抱下来,重新捡起纸巾,扔进了垃圾桶。
深入理解汇编语言子程序设计与系统调用
网安spinage
汇编语言 开发语言 汇编 算法
本文将全面解析汇编语言中子程序设计的核心技术以及系统调用的实现方法,涵盖参数传递的多种方式、堆栈管理、API调用等关键知识点,并提供实际案例演示。一、子程序设计:参数传递的艺术1.寄存器传参:高效简洁.386.modelflat,stdcalloptioncasemap:none.dataxdd5;定义变量ydd6sumdd?.code;函数定义:addxy1addxy1procpushebpmo
漫游漫川关
高曾骏骏
傍晚时分,夕阳从树的缝隙穿过来撒在我们老老小小一家人身上暖暖的,一抬头映入眼帘的是“朝秦暮楚”四个字挂在山壁上,我知道漫川关到了。90岁的老爸在前面慢悠悠的走着,用浓郁的河南话问正在赶路的几个老人家,:“你们是哪里人呀?”其中一个扛着锄头的老人家声如洪钟的答到:“我们是祖祖辈辈生活在这里的漫川关人。你是河南人吧?”看着老爸点点头老人家继续说,“这里可是一鸡鸣三省的地方,河南,陕西,湖北交界处”。老
二十四节气组诗 谷雨
离陌_6639
图片来源网络,若侵犯了你的权益,请联系我删除6.谷雨文/离陌背上行囊背上如行囊的我从此任行程马不停蹄今天家乡的田野春雨快马加鞭播下希望的种子观音不语目送着我和夏天一道在观音山出关图片来源网络,若侵犯了你的权益,请联系我删除你好啊,我是离陌,已然在懵懂中走过了16年的岁月,为了珍惜当下的每一秒,所以立志做一名终身学习者。文学对于我来说是一种信仰,诗歌是我的生命。人生之道,四通八达,即入文学,自当持之
图论算法经典题目解析:DFS、BFS与拓扑排序实战
周童學
数据结构与算法 深度优先 算法 图论
图论算法经典题目解析:DFS、BFS与拓扑排序实战图论问题是算法面试中的高频考点,本博客将通过四道LeetCode经典题目(均来自"Top100Liked"题库),深入讲解图论的核心算法思想和实现技巧。涵盖DFS、BFS、拓扑排序和前缀树等知识点,每道题配有Java实现和易错点分析。1.岛屿数量(DFS遍历)问题描述给定一个由'1'(陆地)和'0'(水)组成的二维网格,计算岛屿的数量。岛屿由水平或
四百八十九章. 春晓客栈鲁易寒
巨木擎天
邓林他们在打量别人的时候,而别人,自然也是在打量他们了。邓林就看见在这大堂里,散散啦啦的有四个人在,其中两个,只是僵直站立,眼眶中燃烧着橙色骨火的骷髅,而另外两个坐着的,才是眼眶中点燃黄色魂火的骨族人。这两个骨族人中的一个,在邓林他们刚一进来的时候,就把注意力都放在了伊莲娜娜的身上,似乎在确认着什么,当看到伊莲娜娜冲着自己点了点头以后,他有些激动的走过来几步,口中说道:“真的是伊莲娜娜公主殿下?您
人性四条
37f656f2331b
第一条:你想给别人讲道理,你就要混的比他好,让别人闭嘴的从来都不是道理,而是身份。第二条:不花钱就想解决问题的人永远都离不开底层的囚笼,很多时候我们需要的不是一碗鸡汤,而是一个巴掌,巴掌越多,就越管用。第三条:所有的人脉都是假象,想与高层次的人建立人脉,只有三种方式,你具备同等的财富,你具备别人需要的能力和资源,你具备同频的智慧,除此之外,皆是假象。第四条:再好的朋友帮忙,都要记得送礼或是请客吃饭
诗圣《杜甫》
Minikaren
今天在樊登听书听完冯至先生《杜甫》一书。童年幸福无忧,青年四海壮游,中年四处漂泊,老年病寒交加。生于盛唐,却不能长在繁华盛世,七年多的安史之乱以安禄山和史思明双双被儿子杀死而谢幕,然而国家历经战乱,百姓颠沛流离,民不聊生,国家焉能不衰?成也玄宗,败也玄宗!难怪道家的太极说,盛极而衰,衰极又盛,其实只不过是一种心理的外化,极度膨胀的虚荣心打败了当年意气风发的励精图治之心,宠幸奸臣李林甫,国家选拔人才
漫步,跳出藩篱
张巧金沙
最近的教学,倍感不爽。一为这国庆之假,把这课上得支离破碎的。放假前,上了四天课,但我却只上了三天,9月30日,我工作室在搞活动,全天的活动,课当然未能上。10月8日学生回校,上了两天课,学生又放回家了。就觉得学生刚有点状态,又回去逍遥去了。感觉吧,教学内容也不敢大胆甩开膀子去教学,所以呀,这教学内容还真上不走,而且学生学下来效果特差。这不,国庆放假前的一个周,测试了两次,均为第一单元,是自考试以来
python笔记14介绍几个魔法方法
抢公主的大魔王
python python
python笔记14介绍几个魔法方法先声明一下各位大佬,这是我的笔记。如有错误,恳请指正。另外,感谢您的观看,谢谢啦!(1).__doc__输出对应的函数,类的说明文档print(print.__doc__)print(value,...,sep='',end='\n',file=sys.stdout,flush=False)Printsthevaluestoastream,ortosys.std
聊斋那些事儿
徒步取经人
网上听一网友说他爸胆子很大,还无神论者,去他们以前得中学看学校了,听他说有一次晚上11点多,他爸爸去关教学楼的大门,走到楼口的时候清晰的听见有人在哭,声音好像在三四楼的样子传出来的,总共就四楼,那个学校,他爸爸一想,谁呀,这么晚了不会有女孩子被男的欺负了吧?就拿着手电筒还有棍子,想着自己一个人还是有点怕,就跑上去了,跑到三楼一听不对,应该是在四楼,就又往上爬上去了,为了给自己壮胆,跑到四楼就喊,谁
大城市和小县城
平凡只要
教育随便一个公立初中老师都是排名靠前的师范类,硕士起步。衣服,随便哪个品牌,一般四折左右才会下手,小地方真的没有这么低折扣。日化用品,这些同样,内地的价格贵的多。牛奶这些更不要说,内地贵,大城市超市经常打折,毕竟人流量大,可以借此吸引人。说小城市消费低的,其实是对生活没有什么要求的,就是吃米饭+青菜+少量荤菜就能满足的。如果要天天牛奶当水喝,肉类当主食,穿要讲品牌,绝对一线消费低。就是房价太高,一
平凡与伟大--父亲的一生
张翔淋
10.寻找四表哥先生要账还是没有结果,做工程,每到年关都会和农民工一起去要工程款。生活不易。从张家口东站下车的父亲下了车才知道离他四表哥的所在地张北县还有好几十里路,父亲背着随身携带的薄薄的一床被子,在没有路,一人高的杂草淀子里越走越迷路,实在找不着方向了,随身携带的被子也被换了吃的。身无分文,又累又饿的父亲只好去了难民登记处。登记员看见父亲带着的地址要找的人是张北县粮食局的李进替,非常高兴的告诉
《家庭教育促进法》解读(14)落到实处方是真
愿我们顺利平安
点击上方蓝字,关注我们吧!坚持写作第七十七天今天继续为大家解读和普及我国首部家庭类法律——《家庭教育促进法》的第四章“社会协同”。这一章是上一章“国家支持”的落脚点。第三十八条居民委员会、村民委员会可以依托城乡社区公共服务设施,设立社区家长学校等家庭教育指导服务站点,配合家庭教育指导机构组织面向居民、村民的家庭教育知识宣传,为未成年人的父母或者其他监护人提供家庭教育指导服务。个人认为这一点非常必要
Anaconda 和 Miniconda:功能详解与选择建议
古月฿
python入门 python conda
Anaconda和Miniconda详细介绍一、Anaconda的详细介绍1.什么是Anaconda?Anaconda是一个开源的包管理和环境管理工具,在数据科学、机器学习以及科学计算领域发挥着关键作用。它以Python和R语言为基础,为用户精心准备了大量预装库和工具,极大地缩短了搭建数据科学环境的时间。对于那些想要快速开展数据分析、模型训练等工作的人员来说,Anaconda就像是一个一站式的“数
四月的最后一天
喵喵诗茵
今天,是四月的最后一天,在上班,但没啥事需要做,今天一天都没有询盘,好像那些买家知道我们快要放假了,也不愿来打扰我们了,哈哈哈。下午,老大叫我们去会议室聊聊提成的事情,每月目标一千美金,超过一千美金按营业额的3%拿提成,看似不多,但以店铺目前的情况来看,我和另一个同事都觉得非常难。每天不到十个询盘,有时候连五个都没有,五个询盘能成一个订单已经是相当不错的结果了,但一个订单带来的营业额扣除了国际运费
环境搭建 | Python + Anaconda / Miniconda + PyCharm 的安装、配置与使用
本文将分别介绍Python、Anaconda/Miniconda、PyCharm的安装、配置与使用,详细介绍Python环境搭建的全过程,涵盖Python、Pip、PythonLauncher、Anaconda、Miniconda、Pycharm等内容,以官方文档为参照,使用经验为补充,内容全面而详实。由于图片太多,就先贴一个无图简化版吧,详情请查看Python+Anaconda/Minicond
你竟然还在用克隆删除?Conda最新版rename命令全攻略!
曦紫沐
Python基础知识 conda 虚拟环境管理
文章摘要Conda虚拟环境管理终于迎来革命性升级!本文揭秘Conda4.9+版本新增的rename黑科技,彻底告别传统“克隆+删除”的繁琐操作。从命令解析到实战案例,手把手教你如何安全高效地重命名Python虚拟环境,附带版本检测、环境迁移、故障排查等进阶技巧,助你提升开发效率10倍!一、颠覆认知:Conda居然自带重命名功能?很多开发者仍停留在“Conda无法直接重命名环境”的认知阶段,实际上自
centos7安装配置 Anaconda3
Anaconda是一个用于科学计算的Python发行版,Anaconda于Python,相当于centos于linux。下载[root@testsrc]#mwgethttps://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.2.0-Linux-x86_64.shBegintodownload:Anaconda3-5.2.0-L
Pandas:数据科学的超级瑞士军刀
科技林总
DeepSeek学AI 人工智能
**——从零基础到高效分析的进化指南**###**一、Pandas诞生:数据革命的救世主****2010年前的数据分析噩梦**:```python#传统Python处理表格数据data=[]forrowincsv_file:ifrow[3]>100androw[2]=="China":data.append(float(row[5])#代码冗长易错!```**核心痛点**:-Excel处理百万行崩
大年初四
薄荷2019
初四未出门还是宅家一天。早上姐姐约我出门不想出就拒绝了,与儿子相聚的每一天我都很珍惜,初七就要出门工作了,虽然距离只有三个小时的车程,却也难见一面。年前在银行买保险理财送了一个空气炸锅,这几天儿子就用网上买的蛋挞皮,自己用淡奶油和牛奶加糖调制蛋挞液,每天烤几个吃,味道真是不错啊,实现了蛋挞自由了!今天中午让老公和面,晚上面发好了。老公和儿子照着网上的方法做披萨,老公不吃肉,就用土豆片、萝卜丝、包菜
意识决定行动
eggplant
2022年3月24日星期四我们经常说“意识决定行动”。“意识”更完整的表达是“思想意识”,思想意识,“搜狗百科”里解释“是人将大脑存储的知识作用于思考生命存在的各种感受的活动。”比较深奥,简单的说我认为就是对事物的认识程度。“意识决定行动”,对事物认知程度的高低决定个体将以什么样的方式去行动,在意识上觉得事情很重要,就会以相对认真的态度去对待,当意识上觉得这件事情没有很大的价值的时候,就会自然将事
ASM系列六 利用TreeApi 添加和移除类成员
lijingyao8206
jvm 动态代理 ASM 字节码技术 TreeAPI
同生成的做法一样,添加和移除类成员只要去修改fields和methods中的元素即可。这里我们拿一个简单的类做例子,下面这个Task类,我们来移除isNeedRemove方法,并且添加一个int 类型的addedField属性。
package asm.core;
/**
* Created by yunshen.ljy on 2015/6/
Springmvc-权限设计
bee1314
spring Web jsp
万丈高楼平地起。
权限管理对于管理系统而言已经是标配中的标配了吧,对于我等俗人更是不能免俗。同时就目前的项目状况而言,我们还不需要那么高大上的开源的解决方案,如Spring Security,Shiro。小伙伴一致决定我们还是从基本的功能迭代起来吧。
目标:
1.实现权限的管理(CRUD)
2.实现部门管理 (CRUD)
3.实现人员的管理 (CRUD)
4.实现部门和权限
算法竞赛入门经典(第二版)第2章习题
CrazyMizzz
c 算法
2.4.1 输出技巧
#include <stdio.h>
int
main()
{
int i, n;
scanf("%d", &n);
for (i = 1; i <= n; i++)
printf("%d\n", i);
return 0;
}
习题2-2 水仙花数(daffodil
struts2中jsp自动跳转到Action
麦田的设计者
jsp webxml struts2 自动跳转
1、在struts2的开发中,经常需要用户点击网页后就直接跳转到一个Action,执行Action里面的方法,利用mvc分层思想执行相应操作在界面上得到动态数据。毕竟用户不可能在地址栏里输入一个Action(不是专业人士)
2、<jsp:forward page="xxx.action" /> ,这个标签可以实现跳转,page的路径是相对地址,不同与jsp和j
php 操作webservice实例
IT独行者
PHP webservice
首先大家要简单了解了何谓webservice,接下来就做两个非常简单的例子,webservice还是逃不开server端与client端。我测试的环境为:apache2.2.11 php5.2.10做这个测试之前,要确认你的php配置文件中已经将soap扩展打开,即extension=php_soap.dll;
OK 现在我们来体验webservice
//server端 serve
Windows下使用Vagrant安装linux系统
_wy_
windows vagrant
准备工作:
下载安装 VirtualBox :https://www.virtualbox.org/
下载安装 Vagrant :http://www.vagrantup.com/
下载需要使用的 box :
官方提供的范例:http://files.vagrantup.com/precise32.box
还可以在 http://www.vagrantbox.es/
更改linux的文件拥有者及用户组(chown和chgrp)
无量
c linux chgrp chown
本文(转)
http://blog.163.com/yanenshun@126/blog/static/128388169201203011157308/
http://ydlmlh.iteye.com/blog/1435157
一、基本使用:
使用chown命令可以修改文件或目录所属的用户:
命令
linux下抓包工具
矮蛋蛋
linux
原文地址:
http://blog.chinaunix.net/uid-23670869-id-2610683.html
tcpdump -nn -vv -X udp port 8888
上面命令是抓取udp包、端口为8888
netstat -tln 命令是用来查看linux的端口使用情况
13 . 列出所有的网络连接
lsof -i
14. 列出所有tcp 网络连接信息
l
我觉得mybatis是垃圾!:“每一个用mybatis的男纸,你伤不起”
alafqq
mybatis
最近看了
每一个用mybatis的男纸,你伤不起
原文地址 :http://www.iteye.com/topic/1073938
发表一下个人看法。欢迎大神拍砖;
个人一直使用的是Ibatis框架,公司对其进行过小小的改良;
最近换了公司,要使用新的框架。听说mybatis不错;就对其进行了部分的研究;
发现多了一个mapper层;个人感觉就是个dao;
解决java数据交换之谜
百合不是茶
数据交换
交换两个数字的方法有以下三种 ,其中第一种最常用
/*
输出最小的一个数
*/
public class jiaohuan1 {
public static void main(String[] args) {
int a =4;
int b = 3;
if(a<b){
// 第一种交换方式
int tmep =
渐变显示
bijian1013
JavaScript
<style type="text/css">
#wxf {
FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#97FF98);
height: 25px;
}
</style>
探索JUnit4扩展:断言语法assertThat
bijian1013
java 单元测试 assertThat
一.概述
JUnit 设计的目的就是有效地抓住编程人员写代码的意图,然后快速检查他们的代码是否与他们的意图相匹配。 JUnit 发展至今,版本不停的翻新,但是所有版本都一致致力于解决一个问题,那就是如何发现编程人员的代码意图,并且如何使得编程人员更加容易地表达他们的代码意图。JUnit 4.4 也是为了如何能够
【Gson三】Gson解析{"data":{"IM":["MSN","QQ","Gtalk"]}}
bit1129
gson
如何把如下简单的JSON字符串反序列化为Java的POJO对象?
{"data":{"IM":["MSN","QQ","Gtalk"]}}
下面的POJO类Model无法完成正确的解析:
import com.google.gson.Gson;
【Kafka九】Kafka High Level API vs. Low Level API
bit1129
kafka
1. Kafka提供了两种Consumer API
High Level Consumer API
Low Level Consumer API(Kafka诡异的称之为Simple Consumer API,实际上非常复杂)
在选用哪种Consumer API时,首先要弄清楚这两种API的工作原理,能做什么不能做什么,能做的话怎么做的以及用的时候,有哪些可能的问题
在nginx中集成lua脚本:添加自定义Http头,封IP等
ronin47
nginx lua
Lua是一个可以嵌入到Nginx配置文件中的动态脚本语言,从而可以在Nginx请求处理的任何阶段执行各种Lua代码。刚开始我们只是用Lua 把请求路由到后端服务器,但是它对我们架构的作用超出了我们的预期。下面就讲讲我们所做的工作。 强制搜索引擎只索引mixlr.com
Google把子域名当作完全独立的网站,我们不希望爬虫抓取子域名的页面,降低我们的Page rank。
location /{
java-归并排序
bylijinnan
java
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] a={20,1,3,8,5,9,4,25};
mergeSort(a,0,a.length-1);
System.out.println(Arrays.to
Netty源码学习-CompositeChannelBuffer
bylijinnan
java netty
CompositeChannelBuffer体现了Netty的“Transparent Zero Copy”
查看API(
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/buffer/package-summary.html#package_description)
可以看到,所谓“Transparent Zero Copy”是通
Android中给Activity添加返回键
hotsunshine
Activity
// this need android:minSdkVersion="11"
getActionBar().setDisplayHomeAsUpEnabled(true);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
静态页面传参
ctrain
静态
$(document).ready(function () {
var request = {
QueryString :
function (val) {
var uri = window.location.search;
var re = new RegExp("" + val + "=([^&?]*)", &
Windows中查找某个目录下的所有文件中包含某个字符串的命令
daizj
windows 查找某个目录下的所有文件 包含某个字符串
findstr可以完成这个工作。
[html]
view plain
copy
>findstr /s /i "string" *.*
上面的命令表示,当前目录以及当前目录的所有子目录下的所有文件中查找"string&qu
改善程序代码质量的一些技巧
dcj3sjt126com
编程 PHP 重构
有很多理由都能说明为什么我们应该写出清晰、可读性好的程序。最重要的一点,程序你只写一次,但以后会无数次的阅读。当你第二天回头来看你的代码 时,你就要开始阅读它了。当你把代码拿给其他人看时,他必须阅读你的代码。因此,在编写时多花一点时间,你会在阅读它时节省大量的时间。让我们看一些基本的编程技巧: 尽量保持方法简短 尽管很多人都遵
SharedPreferences对数据的存储
dcj3sjt126com
SharedPreferences简介: &nbs
linux复习笔记之bash shell (2) bash基础
eksliang
bash bash shell
转载请出自出处:
http://eksliang.iteye.com/blog/2104329
1.影响显示结果的语系变量(locale)
1.1locale这个命令就是查看当前系统支持多少种语系,命令使用如下:
[root@localhost shell]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
Android零碎知识总结
gqdy365
android
1、CopyOnWriteArrayList add(E) 和remove(int index)都是对新的数组进行修改和新增。所以在多线程操作时不会出现java.util.ConcurrentModificationException错误。
所以最后得出结论:CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。发生修改时候做copy,新老版本分离,保证读的高
HoverTree.Model.ArticleSelect类的作用
hvt
Web .net C# hovertree asp.net
ArticleSelect类在命名空间HoverTree.Model中可以认为是文章查询条件类,用于存放查询文章时的条件,例如HvtId就是文章的id。HvtIsShow就是文章的显示属性,当为-1是,该条件不产生作用,当为0时,查询不公开显示的文章,当为1时查询公开显示的文章。HvtIsHome则为是否在首页显示。HoverTree系统源码完全开放,开发环境为Visual Studio 2013
PHP 判断是否使用代理 PHP Proxy Detector
天梯梦
proxy
1. php 类
I found this class looking for something else actually but I remembered I needed some while ago something similar and I never found one. I'm sure it will help a lot of developers who try to
apache的math库中的回归——regression(翻译)
lvdccyb
Math apache
这个Math库,虽然不向weka那样专业的ML库,但是用户友好,易用。
多元线性回归,协方差和相关性(皮尔逊和斯皮尔曼),分布测试(假设检验,t,卡方,G),统计。
数学库中还包含,Cholesky,LU,SVD,QR,特征根分解,真不错。
基本覆盖了:线代,统计,矩阵,
最优化理论
曲线拟合
常微分方程
遗传算法(GA),
还有3维的运算。。。
基础数据结构和算法十三:Undirected Graphs (2)
sunwinner
Algorithm
Design pattern for graph processing.
Since we consider a large number of graph-processing algorithms, our initial design goal is to decouple our implementations from the graph representation
云计算平台最重要的五项技术
sumapp
云计算 云平台 智城云
云计算平台最重要的五项技术
1、云服务器
云服务器提供简单高效,处理能力可弹性伸缩的计算服务,支持国内领先的云计算技术和大规模分布存储技术,使您的系统更稳定、数据更安全、传输更快速、部署更灵活。
特性
机型丰富
通过高性能服务器虚拟化为云服务器,提供丰富配置类型虚拟机,极大简化数据存储、数据库搭建、web服务器搭建等工作;
仅需要几分钟,根据CP
《京东技术解密》有奖试读获奖名单公布
ITeye管理员
活动
ITeye携手博文视点举办的12月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。
12月试读活动回顾:
http://webmaster.iteye.com/blog/2164754
本次技术图书试读活动获奖名单及相应作品如下:
一等奖(两名)
Microhardest:http://microhardest.ite