想制作Python爬虫小软件练练手吗?那就进来看看吧!(1)
在这里我把写的小软件代码放在下面,废话不多说,直接上效果图和代码。
这软件的功能主要是根据用户的选择进行一键爬取图片,后面我也会写几篇文章详细的讲解一下我遇到的问题及解决方法。
这是软件的主页面
首先
制作这个小软件,需要用到 Python,Pycharm,PyQt5设计师,像博主用的软件版本是Python 3.9,Pycharm 2021 ,PyQt5 5.15。
1.Pycharm
用Pycharm,创建3个Python包,分别为,main.py,图片爬虫.py,ui_image.py。
main.py 主函数
import base64
import sys
import threading
from PyQt5.QtGui import QPalette, QPixmap, QBrush
from PyQt5.QtWidgets import QApplication, QMainWindow
import 彼岸图网
from 图片爬虫 import pac
class Le(threading.Thread): # 多线程,继承Thread
def run(self): # 将费时间的程序放在run方法,防止主页面卡顿或无响应
b = click_txt(txt='4kdongman')
end = ui.lineEdit_2.text()
pac(txt=b, end=int(end))
ui.label_2.setText('爬取成功')
# 要调动的函数
def co(): # 窗口背景图and透明度设置
# 为窗口增加背景图
from ui_image_png import img as one # 引入img变量,赋别名为one
...
tmp = open('one.png', 'wb') # 创建临时的文件
tmp.write(base64.b64decode(one)) # 把这个one图片解码出来,写入文件中去。
tmp.close()
# 现在就能用了,用完(加载到程序里之后)删了就好
# xxxxxx #这里one.png 就已经拿出来了,可以用来。下面就可以对此进行你想要的操作了。
# do_something_with(one.png) # 做任何你想做的
# xxxxxx
# os.remove('one.png') # 用完可以删除这个临时图片
palette = QPalette()
pix = QPixmap('one.png') # 图片位置最好放在(main.py)所在的文件夹下
# 图片自适应窗口大小,将下列代码#去掉
# pix = pix.scaled(MainWindow.width(), MainWindow.height())
palette.setBrush(QPalette.Background, QBrush(pix))
MainWindow.setPalette(palette)
# 设置窗口透明度
MainWindow.setWindowOpacity(1)
# MainWindow.setAttribute(QtCore.Qt.WA_TintedBackground)
def yc(): # 按钮背景色设置,背景透明
# 按钮的背景色设置代码,后面4位数字,前面3位是背景色rgb代码,后1位是决定按钮透明的数值0-255,数值=0,按钮实现透明
ui.pushButton.setStyleSheet('QPushButton{background-color:rgb(255,255,255,0)}')
ui.pushButton_2.setStyleSheet('QPushButton{background-color:rgb(255,255,255,0)}')
ui.pushButton_3.setStyleSheet('QPushButton{background-color:rgb(255,255,255,0)}')
ui.pushButton_4.setStyleSheet('QPushButton{background-color:rgb(255,255,255,0)}')
ui.pushButton_5.setStyleSheet('QPushButton{background-color:rgb(255,255,255,0)}')
ui.pushButton_6.setStyleSheet('QPushButton{background-color:rgb(255,255,255,0)}')
ui.lineEdit_2.setStyleSheet('QPushButton{background-color:rgb(255,255,255,0)}')
# ui.lineEdit_2.setStyleSheet("background:transparent;border-width:0;border-style:outset")
# 下列代码可以将控件的背景色设置位透明,边框去除(border-width:0;border-style:outset),控件透明(background:transparent;)
ui.lineEdit_2.setStyleSheet("background:transparent")
# 按钮的backround(背景色)为黑色,当鼠标落在按钮上显示yelllow(黄色)
# ui.pushButton.setStyleSheet(
# '''QPushButton{background:#000000;border-radius:5px;}QPushButton:hover{background:yellow;}''')
def key(): # 解锁函数
ui.pushButton.setEnabled(True)
ui.pushButton_2.setEnabled(True)
ui.pushButton_3.setEnabled(True)
ui.pushButton_4.setEnabled(True)
ui.pushButton_5.setEnabled(True)
def button(): # 锁住专区函数
ui.pushButton.clicked.connect(click_dm)
ui.pushButton.setEnabled(False)
ui.pushButton_2.clicked.connect(click_mn)
ui.pushButton_2.setEnabled(False)
ui.pushButton_3.clicked.connect(click_fj)
ui.pushButton_3.setEnabled(False)
ui.pushButton_4.clicked.connect(click_yx)
ui.pushButton_4.setEnabled(False)
ui.pushButton_5.clicked.connect(click_ys)
ui.pushButton_5.setEnabled(False)
def click_txt(txt): # 专区判断函数
if txt == '4kdongman':
a1 = '4kdongman'
return a1
elif txt == '4kmeinv':
a2 = '4kmeinv'
return a2
elif txt == '4kfengjing':
a3 = '4kfengjing'
return a3
elif txt == '4kyouxi':
a4 = '4kyouxi'
return a4
elif txt == '4kyingshi':
a5 = '4kyingshi'
return a5
def click_dm(): # 按钮点击函数
ui.label_2.setText("已选择4k动漫专区")
ui.label_2.setText("正在爬取.....")
button()
t1.start()
def click_mn(): # 按钮点击函数
ui.label_2.setText("已选择4k美女专区")
ui.label_2.setText("正在爬取.....")
button()
t1.start()
def click_fj(): # 按钮点击函数
ui.label_2.setText("已选择4k风景专区")
ui.label_2.setText("正在爬取.....")
button()
t1.start()
def click_yx(): # 按钮点击函数
ui.label_2.setText("已选择4k游戏专区")
ui.label_2.setText("正在爬取.....")
button()
t1.start()
def click_ys(): # 按钮点击函数
ui.label_2.setText("已选择4k影视专区")
ui.label_2.setText("正在爬取.....")
button()
t1.start()
if __name__ == '__main__':
# 创建QApplication的实例
app = QApplication(sys.argv)
MainWindow = QMainWindow()
# 赋值,方便操作
ui = 彼岸图网.Ui_MainWindow()
# 启动setup
ui.setupUi(MainWindow)
# 窗口背景图and透明度
co()
# 背景色
yc()
# 显示窗口
MainWindow.show()
# 锁住专区按钮
button()
t1 = Le()
# 点击按钮6,解锁专区按钮
ui.pushButton_6.clicked.connect(key)
# 进入程序的主循环、并通过exit函数确保主循环安全结束
sys.exit(app.exec_())
图片爬虫.py
import os
import re
import requests
def pac(txt, end):
if not os.path.exists('D:/彼岸图网'):
os.makedirs('D:/彼岸图网')
for i in range(2, end):
url = 'https://pic.netbian.com/' + txt + '/index_' + str(i) + '.html'
headers = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
'Chrome/92.0.4515.107 ' \
'Safari/537.36 '
res = requests.get(url, headers)
res.encoding = 'gbk'
html = res.text
contents = re.findall(r'<a href="(.*?)" target="_blank"><img src=(.*?) alt=(.*?)><b>(.*?)</b></a>', html)
# print(contents)
for content in contents:
img = content[0]
img_urls = 'https://pic.netbian.com' + img
res1 = requests.get(img_urls)
res1.encoding = 'gbk'
html1 = res1.text
contents1 = re.findall(
r'<a href="" id="img"><img src="(.*?)" data-pic="(.*?)" alt="(.*?)" title="(.*?)"></a>',
html1)
for content1 in contents1:
img1 = content1[0]
img_urls1 = 'https://pic.netbian.com' + img1
title = content1[2]
print(title)
print(img_urls1)
res2 = requests.get(img_urls1)
with open('D:/彼岸图网/' + title + '.jpg', 'wb')as fp:
fp.write(res2.content)
fp.close()
最后
由于第三包的代码量太大(背景图转.py文件),导致所以代码不能放在一个博客里,请感兴趣同学可以在我第二个博客获取剩余代码。