电商平台数据抓包软件由三部分组成:前端GUI可视化界面+后端连接+数据库
1、GUI可视化界面:
- 结果展示:
- 代码:
def __init__(self):
super().__init__()
self.initUI()
def initUI(self): # 设计界面
self.setGeometry(300, 200, 1280, 350) # 设置窗体尺寸
palette = QPalette()
palette.setBrush(QPalette.Background, QBrush(QPixmap("./0101.jpg")))
self.setPalette(palette)
self.setWindowTitle('电商收集平台') # 命名窗体的标题
QToolTip.setFont(QFont('SansSerif', 12)) # 设置控件提示信息的字体格式及大小
self.btn = QPushButton('开始', self) # 设计开始按钮
self.btn.setToolTip('单击开始爬取') # 设置按钮的提示信息
self.btn.clicked.connect(self.doAction) # 建立信号和槽的联系,将单击信号与下面的doacion进行链接
#self.pbar = QProgressBar(self) # 设计一个进度条
self.textEdit = QTextEdit(self) # 设计一个文本输出框
self.textEdit.setPlaceholderText("帮助文档:\n1.右侧输入商品名称\n2.单击开始进行下载\n3.单击停止结束下载")
self.textEdit.setStyleSheet("color:black")
self.textEdit.resize(1150, 200) # 设置文本输出框大小
self.lineEdit1 = QLineEdit(self) # 设计输入框
self.lineEdit1.setPlaceholderText("输入搜索关键字")
self.lineEdit2 = QLineEdit(self) # 设计输入框
self.lineEdit2.setPlaceholderText("输入爬取数据量")
self.groupBox = QGroupBox(self) # 设置QT容器
self.groupBox.move(1130, 125) # 移动容器的位置
self.groupBox.resize(120, 190) # 设置容器的尺寸
self.groupBox.setTitle('菜单栏') # 设置容器的标题
self.groupBox.setStyleSheet("color:black")
self.groupBox.setFont(QFont("微软雅黑", 14, QFont.Bold))
self.groupBox.setAlignment(4) # 4为ALignHCenter为居中的意思
layout = QVBoxLayout() # 新建一个垂直布局
layout.addWidget(self.lineEdit1) # 往该布局中添加各种控件
layout.addWidget(self.lineEdit2) # 往该布局中添加各种控件
layout.addWidget(self.btn)
self.groupBox.setLayout(layout) # 显示该布局
self.groupBox2 = QGroupBox(self) # 设置QT容器2
self.groupBox2.move(10, 10)
self.groupBox2.resize(1110, 300)
self.groupBox2.setTitle('程序可视化界面')
self.groupBox2.setStyleSheet("color:white")
self.groupBox2.setFont(QFont("微软雅黑",14, QFont.Bold))
self.groupBox2.setAlignment(4) # 4为ALignHCenter为居中的意思
layout2 = QVBoxLayout()
layout2.addWidget(self.textEdit)
self.groupBox2.setLayout(layout2)
self.groupBox5 = QGroupBox(self) # 设置QT容器5
self.groupBox5.setStyleSheet("border:none") # 隐藏容器的边框
self.groupBox5.move(1128, 8)
self.groupBox5.resize(125, 120)
self.lbl = QLabel(self) # 新建一个控件来显示图片
layout5 = QVBoxLayout()
pixmap = QPixmap("./011.jpg") # 按指定路径找到图片
self.lbl.setPixmap(pixmap) # 在label上显示图片
self.lbl.setScaledContents(True) # 让图片自适应label大小
layout5.addWidget(self.lbl)
self.groupBox5.setLayout(layout5)
self.show() # 显示主窗口
def doAction(self): # 主函数,用于下载数据
goods = []
name = self.lineEdit1.text() # 获取输入的内容
number = int(self.lineEdit2.text()) # 获取输入的内容
QMessageBox.question(self, '提示',
"单击yes爬取数据,爬取过程请耐心等待", QMessageBox.Yes, QMessageBox.Yes) # 最后一个QMessageBox.No的意思是默认为no
try:
browser.get('https://www.jd.com/')
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#key'))
)
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#search > div > div.form > button > i')))
input.send_keys(str(name))
submit.click()
goods = get_products()
for good in goods:
time.sleep(1)
self.textEdit.append(str(good))
QApplication.processEvents() # 刷新窗口防止卡死
except TimeoutError:
print('error')
for i in range(2, int(number/60)+3):
goods = []
QApplication.processEvents() # 刷新窗口防止卡死
time.sleep(random.randint(70, 80))
goods = next_page(i)
for good in goods:
time.sleep(1)
self.textEdit.append(str(good))
QApplication.processEvents() # 刷新窗口防止卡死
self.textEdit.append('停止下载 ')
browser.close()
def closeEvent(self, event): # 重写关闭事件
reply = QMessageBox.question(self, '提示', # 设计一个提示框
"确定要退出搜索程序吗?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No) # 最后一个QMessageBox.No的意思是默认为no
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
2、后台运行:
- 结果展示:
右侧输入搜索的商品,以及想要爬取的数据总量,也可输入商品的url:
后台运行,将登录模拟浏览器,搜索商品:
将搜集的商品数据显示,并录入数据库中:
此为后端平台的爬取过程:❤❤❤
- 代码:
def next_page(page_number):
try:
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next')))
submit.click()
Goods = get_products()
return Goods
except TimeoutError:
next_page(page_number)
def get_products():
Good = []
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList .gl-warp .gl-item')))
html = browser.page_source
doc = pq(html)
items = doc('#J_goodsList .gl-warp .gl-item').items()
for item in items:
product = {
'name':item.find('.p-name').text(),
'shop':item.find('.p-shop').text(),
'price':item.find('.p-price').text(),
'commit':item.find('.p-commit').text(),
'self': item.find('.p-icons .goods-icons').text(),
}
print(product)
Good.append(str(product))
save_to_mongo(product)
QApplication.processEvents() # 刷新窗口防止卡死
if stop == 1:
break
return Good
3、数据库接口及管理:
- 结果展示:
- 代码:
MONGO_URL = 'localhost'
MONGO_DB = 'jingdong'
MONGO_TABLE = 'product'
SERVICE_ARGS = ['--load-images=false','--disk-cache=true']
def save_to_mongo(result):
try:
if db[MONGO_TABLE].insert(result):
print('存储到MONGO_DB成功',result)
except Exception:
print('存储到MONGO_DB失败',result)
最新出炉的后台爬虫+可视化操作,有兴趣的请在下方留言交流~