使用Python编写的图形用户界面(GUI)应用程序,结合了PyQt6
库和requests
库以及BeautifulSoup
库来实现一个简单的公众号图片采集工具。
实现代码
import os
import sys
import requests
import re
from bs4 import BeautifulSoup
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton, QMessageBox, QLabel
from datetime import datetime
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设置窗口标题和大小
self.setWindowTitle("公众号图片采集")
# 前两位是窗口坐标,后两位是窗口大小
self.setGeometry(300, 300, 240, 120)
# 创建一个水平布局
layout = QVBoxLayout()
# 创建一个文本
self.label = QLabel("图片一定不存在C盘", self)
# 创建一个输入框
self.lineEdit = QLineEdit(self)
# 设置输入框的Qt样式表
self.lineEdit.setStyleSheet("""
QLineEdit {
border: 1px solid #4CAF50; /* 设置边框样式 */
border-radius: 5px; /* 设置边框圆角 */
padding: 2px; /* 设置内边距 */
background-color: #f0f0f0; /* 设置背景颜色 */
color: black; /* 设置文本颜色 */
font-size: 16px; /* 设置字体大小 */
}
QLineEdit:focus {
border-color: #008000; /* 当输入框获得焦点时改变边框颜色 */
}
""")
self.lineEdit.setPlaceholderText("请输入链接")
# 创建一个按钮
self.button = QPushButton('提交', self)
# 设置按钮的样式
self.button.setStyleSheet("""
QPushButton {
background-color: #4CAF50; /* 绿色背景 */
color: white; /* 白色文字 */
border-style: outset; /* 外凸边框 */
border-width: 2px; /* 边框宽度 */
border-radius: 10px; /* 边框圆角 */
border-color: beige; /* 边框颜色 */
font: bold 14px; /* 字体加粗,字号14 */
padding: 6px; /* 内边距 */
}
QPushButton:pressed {
background-color: #388E3C; /* 按下时的背景颜色 */
}
""")
self.button.clicked.connect(self.fetch_and_copy_div)
# 将输入框和按钮添加到布局中
layout.addWidget(self.label)
layout.addWidget(self.lineEdit)
layout.addWidget(self.button)
# 设置窗口的布局
self.setLayout(layout)
def fetch_and_copy_div(self):
# 获取输入框中的内容self.lineEdit.text()
url = self.lineEdit.text()
html = self.getHTMLText(url)
img_url = self.getimgURL(html)
# print(img_url)
self.download(img_url)
QMessageBox.information(self, "提示", "下载完成")
# 获取网页信息
def getHTMLText(self, url):
try:
response = requests.get(url, timeout=30)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except requests.RequestException as e:
QMessageBox.information(self, "提示", "请求错误")
return ""
# 解析网页,获取所有图片url
def getimgURL(self, html):
soup = BeautifulSoup(html, "html.parser")
image_urls = []
for i in soup.find_all("img"):
try:
ad = re.findall(r'.*src="(.*?)?" .*', str(i))
if ad:
image_urls.append(ad)
except KeyError: # 如果src属性不存在,尝试使用data-src属性(某些情况下图片链接可能放在这里)
try:
image_url = i['data-src'] # 尝试获取data-src属性作为备用方案
if 'http' in image_url: # 检查是否为完整的URL并添加到列表中
image_urls.append(image_url)
except:
continue
return image_urls
# 新建文件夹pic,下载并保存爬取的图片信息
def download(self, urls):
# 获取当前时间
now = datetime.now()
# 格式化当前时间
formatted_now = now.strftime("%Y%m%d%H%M")
# 设置文件目录
root = "C:\公众号爬取\" + formatted_now + "\"
if not os.path.exists(root):
os.makedirs(root)
# 遍历URLs并下载
for index, url in enumerate(urls):
try:
response = requests.get(url[0], timeout=30)
response.raise_for_status()
# 尝试根据 Content-Type 设置文件扩展名
content_type = response.headers.get('Content-Type')
if content_type:
ext = content_type.split('/')[-1].lower()
if ext in ['jpeg', 'jpg', 'png', 'gif']:
ext = ext
else:
ext = 'bin' # 如果不是常见图片格式,则保存为二进制文件
else:
ext = 'bin'
path = os.path.join(root, f"{index}.{ext}")
with open(path, 'wb') as f:
f.write(response.content)
except requests.RequestException as e:
QMessageBox.information(self, "错误", f"无法下载图片: {e}")
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
提取码:bDXi