零基础学Python|Python高阶学习--汽车之家图片抓取工具实现

本文介绍了一个使用Python和PyQT5开发的项目,通过爬取汽车之家网站上的阿斯顿.马丁汽车图片,实现抓取、本地保存并提供图片分类浏览功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者主页:编程千纸鹤

作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师

主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享

收藏点赞不迷路  关注作者有好处

文末获得源码

本章节主要实现一个图片抓取的工具,结合Python与PyQT5来抓取汽车之家的汽车图片并保存到本地,完成对图片的分类浏览操作,本项目主要是爬取网站上阿斯顿.马丁的汽车图片,具体实现的效果如下所示。

用户登录

点击阿斯顿.马丁 汽车图片开始抓取图片:

 抓去完毕后可以分类查看汽车图片

点击图片上的按钮可以实现图片放大查看

 本项目实现的基本流程如下:

 最终实现的核心代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'tnl.ui'
#
# Created by: PyQt5 UI code generator 5.11.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import time
import urllib.request
from bs4 import BeautifulSoup
import os
from PIL import Image

#获取汽车图片方法类
class ReTbmm():
    def Retbmm(self):
        #爬虫开始时间
        start = time.time()
        #返回当前工作目录
        self.cdir = os.getcwd()
        #爬取的网址
        # https://www.autohome.com
        # 车身外观
        url1 ='https://car.autohome.com.cn/pic/series-s32890/385-1.html#pvareaid=2023594'
        # 中控方向盘
        url2='https://car.autohome.com.cn/pic/series-s32890/385-10.html#pvareaid=2042220'
        # 车厢座椅
        url3 = 'https://car.autohome.com.cn/pic/series-s32890/385-3.html#pvareaid=2042220'
        # 其他细节
        url4 = 'https://car.autohome.com.cn/pic/series-s32890/385-12.html#pvareaid=2042220'
        self.getImag('车身外观',url1)
        self.getImag('中控方向盘', url2)
        self.getImag('车厢座椅', url3)
        self.getImag('其他细节', url4)
        end=time.time()
        #输出运行时间
        print('run time:'+str(end -start))
    #下载图片方法
    def getImag(self,name,urls):
        user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240'
        headers={'User-Agent':user_agent}
        #访问连接
        request= urllib.request.Request(urls,headers=headers)
        #获取数据
        response =urllib.request.urlopen(request)
        #解析数据
        bsObj = BeautifulSoup(response,'html.parser')
        #查找所有img标记
        t1 =bsObj.find_all('img')
        for t2 in t1:
            t3 =t2.get('src')
            print(t3)
        #创建图片存储路径
        path = self.cdir +'/mrsoft/'+str(name)
        if not os.path.exists(path):
            #根据路径建立图片文件夹
            os.makedirs(path)
        #每次调用初始化图片序号
        n =0
        #循环图片集合
        for img in t1:
            #每次图片顺序加1
            n=n+1
            #获取图片路径
            link =img.get('src')
            if link:
                #拼接图片连接
                s ='http:'+str(link)
                #截取扩展名
                i = link[link.rfind('.'):]
                try:
                    #访问图片链接
                    request=urllib.request.Request(s)
                    #获取返回事件
                    response =urllib.request.urlopen(request)
                    #读取返回内容
                    imgData=response.read()
                    #创建文件
                    pathfile =path+r'/'+str(n)+i
                    with open( pathfile,'wb') as f:
                        #图片写入文件
                        f.write(imgData)
                        #图片写入后关闭文件
                        f.close()
                        print('下载完成图片'+n)
                except:
                    print('11')

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1300, 900)
        self.scrollArea = QtWidgets.QScrollArea(Form)
        self.scrollArea.setGeometry(QtCore.QRect(20, 70, 181, 800))
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setObjectName("scrollArea")
        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 179, 800))
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
        self.treeView = QTreeWidget(self.scrollAreaWidgetContents)
        self.treeView.setGeometry(QtCore.QRect(0, 0, 181, 761))
        self.treeView.setObjectName("treeView")
        self.treeView.setHeaderLabel('爬虫爬出的结果')
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.scrollArea_2 = QtWidgets.QScrollArea(Form)
        self.scrollArea_2.setGeometry(QtCore.QRect(200, 70, 1000, 800))
        self.scrollArea_2.setWidgetResizable(True)
        self.scrollArea_2.setObjectName("scrollArea_2")
        self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
        self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
        self.gridLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_2)
        self.gridLayout.setContentsMargins(5, 5, 5, 5)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(20, 20, 161, 41))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "明日科技"))
        self.pushButton.setText(_translate("Form", "阿斯顿·马丁 汽车图片"))
        self.root = QTreeWidgetItem(self.treeView)
        self.root.setText(0,'V8 Vantage 2018款 4.0T V8')
        self.pushButton.clicked.connect(self.btnstate)
    #搜索方法
    def btnstate(self):
        ui =ReTbmm()
        ui.Retbmm()
        self.path =cdir +'/mrsoft'
        dirs =os.listdir(self.path)
        for dir in dirs:
            QTreeWidgetItem(self.root).setText(0,dir)
        self.treeView.clicked.connect(self.onTreeclicked)
    #分类树形结构点击事件处理
    def onTreeclicked(self):
        items =self.treeView.currentItem()
        if items.text(0)=='V8 Vantage 2018款 4.0T V8':
            self.root.takeChild()
            dirs = os.listdir(self.path)
            for dir in dirs:
                QTreeWidgetItem(self.root).setText(0, dir)
            self.treeView.clicked.connect(self.onTreeclicked)
        else:
            while self.gridLayout.count():
                item =self.gridLayout.takeAt(0)
                widget=item.widget()
                widget.deleteLater()
            filenames=[]
            for filename in os.listdir(cdir+'/mrsoft/'+items.text(0)):
                filenames.append(filename)
            i=-1
            for n in range(len(filenames)):
                x = n%3
                if(x ==0 ):
                    i +=1
                self.widget=QWidget()
                self.widget.setGeometry(QtCore.QRect(110,40,350,300))
                self.widget.setObjectName('widget'+str(n))
                self.label=QLabel(self.widget)
                self.label.setGeometry(QtCore.QRect(0, 0, 350, 300))
                self.label.setPixmap(QPixmap(self.path+'/'+items.text(0)+'/'+filenames[n]))
                self.label.setScaledContents(True)
                self.label.setObjectName('label'+str(n))

                self.commandLinkButton = QCommandLinkButton(self.widget)
                self.commandLinkButton.setGeometry(QtCore.QRect(0, 0, 111, 41))
                self.commandLinkButton.setText(filenames[n])
                self.commandLinkButton.setObjectName('commandLinkButton'+str(n))
                self.commandLinkButton.clicked.connect(lambda : self.wichbtn(self.path+'/'+items.text(0)+'/'))
                self.gridLayout.addWidget(self.widget,i,x)
            self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2)
            self.verticalLayout.addWidget(self.scrollArea_2)
            self.scrollAreaWidgetContents_2.setMaximumWidth(800)
            self.scrollAreaWidgetContents_2.setMinimumHeight(i*300)
        pass
    #查看大图功能
    def wichbtn(self,tppath):
        sender = self.gridLayout.sender()
        img = Image.open(tppath +sender.text())
        img.show()
#登录窗口
class FirstWindow(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(249, 212)
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setGeometry(QtCore.QRect(40, 30, 181, 151))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(self.widget)
        self.lineEdit.setObjectName("lineEdit")
        self.verticalLayout.addWidget(self.lineEdit)
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setObjectName("label_2")
        self.verticalLayout.addWidget(self.label_2)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.verticalLayout.addWidget(self.lineEdit_2)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.widget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "登录"))
        self.label.setText(_translate("Form", "用户名(znz)"))
        self.label_2.setText(_translate("Form", "密码(123456)"))
        self.pushButton.setText(_translate("Form", "登录"))
        self.pushButton_2.setText(_translate("Form", "退出"))
#       登录
        self.pushButton.clicked.connect(self.onclick)
        # 退出
        self.pushButton_2.clicked.connect(quit)

    def onclick(self):
        if self.lineEdit.text()=='znz':
             if self.lineEdit_2.text()=='123456':
                 MainWindow1.close()
                 MainWindow.show()
             else:
                 self.lineEdit_2.setText('密码错误请重新输入')
        else:
            self.lineEdit.setText('用户名错误请重新输入')
#主程序运行
if __name__ =='__main__':
    App =QApplication(sys.argv)
    MainWindow1 = QtWidgets.QMainWindow()
    cdir = os.getcwd()
    ex = FirstWindow()
    ex.setupUi(MainWindow1)
    MainWindow1.show()
    MainWindow =QtWidgets.QMainWindow()
    ui= Ui_Form()
    ui.setupUi(MainWindow)
    sys.exit(App.exec_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程指南针

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值