使用Python写出一个GUI可视化爬虫工具总结分享

简介: 我本是一名前端开发,不能说熟悉...最起码前端目前主流技术 Vue React 还是 jQuery 都有使用过。可以说这三个也是包含最少 60%的使用场景了。突然转变去写 Python 真的很不适应,不过还好。也是一种锻炼。

theme: devui-blue

highlight: sunburst

私人文档,仅供参考!

前言:我本是一名前端开发,不能说熟悉...最起码前端目前主流技术 Vue React 还是 jQuery 都有使用过。可以说这三个也是包含最少 60%的使用场景了。突然转变去写 Python 真的很不适应,不过还好。也是一种锻炼。当初我的想法是 做一个Web平台配合 Java 来调用写好的 Python。当然啦,期间我也使用过 Nodejs 来写后端,结果不太理想。经过一周半的编写,调试,终于可以对接后端,我传递参数给接口,接口服务调用 Python 然后把数据返回给我的同时插入数据库。但是...我还是想的太简单了,中间各种问题层出不穷,真的要把我搞崩溃了。加班到十点多,回家了一直和朋友调试到凌晨,问题仅仅解决了一半...后来经过一番商讨,我反思自己,为什么要做的这么”完美“呢?能用不就好了。于是痛定思痛!想了一晚上,脑子里突然蹦出一个想法!我什么...非要做个Web端呢?直呼握草,立马坐起来拍大腿!我记得 Python 好像是可以写桌面端应用的!!于是次日上班。直接开干!!


软件介绍

软件运行时直接生成txt和csv两种文件。可选

操作流程:

graph TD
手动输入关键词 --> 页数
导入文件 --> 页数--> 执行--> 新建文件并且插入数据

先看一下软件成品吧(截至文章发布前) 以及我的GitHub地址

微信截图_20230612093254.png

样式可以用qss来编写

这款桌面端应用目前的功能包括但不限于:分词循环爬取搜索导入文件爬取软件设置在线更新任务/错误捕获输出当前进度自动更新代理

使用技术及三方库

语言使用的是 Python39 用到的库包括但不限于 PyQt5、requests、BeautifulSoup、os、time、urllib、tldextract、random、psutil、chardet。
我就捡几个重点说说吧(仅限于个人理解)。

PyQt5: 这个库就是标题所写 GUI(Graphics User Interface),中文名称为图形用户界面,是计算机与其使用者之间的对话接口。我之前用的是 tk 界面实在是!太丑了!

psutil: 专门用来获取操作系统以及硬件相关的信息,比如:CPU、磁盘、网络、内存等等

requests: 如你所见,就是用来请求的

代码结构

序主要分为两个类:Spider 和 MainWindow。

Spider 类主要实现了以下几个方法:

  • init方法:初始化Spider类的属性,包括关键词、页数、文件名、任务输出、进度输入和主窗口等。然后调用search_mobile_web方法开始爬取。

  • run_getiCookie方法:用于获取cookie。

  • convert_params方法:将参数转换为列表。

  • set_ArrayList方法:用于获取URL的域名。

  • search_mobile_web方法:主要实现了爬取神马搜索引擎的搜索结果的功能。首先获取关键词和页数,然后循环爬取每一页的搜索结果。在爬取每一页的搜索结果时,先设置代理,然后发送请求,获取响应,解析响应,获取搜索结果的标题和URL,并将结果写入文件。最后关闭所有的TCP连接。
  • MainWindow 类主要实现了以下几个方法:

  • init方法:初始化MainWindow类的属性,包括关键词、页数、文件名、任务输出、进度输入和主窗口等。然后创建控件,包括关键词输入框、页数输入框、文件名输入框、任务输出框、进度输入框、错误输出框、执行按钮、导入文件按钮、取消导入按钮和强行停止按钮。最后创建菜单栏和菜单。

  • show_setting_dialog方法:用于显示代理参数设置对话框。

  • show_error方法:用于在错误输出框中显示错误信息。

  • select_file方法:用于选择要导入的文件。

  • stop_script方法:用于停止程序的执行。

  • cancel_import方法:用于取消导入文件。

  • get_next_word方法:用于获取下一个要爬取的关键词。

  • run_script方法:用于执行爬虫程序。首先获取关键词、页数和文件名,然后创建Spider对象,并调用search_mobile_web方法开始爬取。最后将爬取结果输出到任务输出框中。如果出现错误,将错误信息输出到错误输出框中。
  • 简单来说Spider负责主线程爬虫逻辑编写,而MainWindow就是负责 GUI 的绘制以及软件的操作反馈等。


    部分代码介绍

    爬虫这块代码我就不介绍了。因为每个、任何一个爬虫都是独一无二的,无非就是 get 访问网页拿到源代码,然后通过各种方式例如类 ID 来进行定位 提取而已。

    介绍Spider的:
    run_getiCookie方法,这个方法可能不适合绝大部分人,因为我爬取的是神马搜索引擎,他的 Cookie 是每次请求都会变化,如果你拿了一个一直用,不出五次,绝对反爬。所以我做的操作是 一个 Cookie 就用两次。

    下面是代码

    def run_getiCookie(self):
        urls = 'https://访问一个能拿到Cookie的地址'
        response= requests.get(urls) # get访问网页
        cookie = response.headers['Set-Cookie'] # 利用response库自带方法取提取header里面的Cookie 然后储存到外部,
        return {
       
        # 最后返回我们请求所需要的请求头参数
            'User-Agent': random.choice(agent_list), #这个方法是在众多User-Agent列表里每次提取一个,防止反爬。
            "Accept-Encoding":'参数',
            "Accept-Language":'参数',
            "Server": "参数",
            "Content-Type": "参数",
            'Cookie':cookie
         }
    

    介绍MainWindow的:

    show_error方法是用于在错误输出框中显示错误信息。该方法接受一个 message 参数,用于指定要显示的错误信息。在方法内部,使用 Qt 的 appendPlainText 方法将 message 添加到错误输出框中。该方法主要用于在程序执行过程中出现错误时,将错误信息显示给用户,方便用户进行排查和解决。该方法的代码如下:

    @staticmethod
    def show_error(self, error_msg):
        #静态方法,供外部调用
        # 在错误输出文本框中显示错误信息
        #可以使用append
        self.error_output.setPlainText(error_msg + '\n')
    
    def show_errorMainWindow(self, error_msg):
        self.error_output.setPlainText(error_msg + '\n')
    

    可能有的人就问了,为什么同样功能的代码要写两遍呢?
    对,我也没办法技术有限。因为不同的类调用方法的话,针对于这个函数,我不太熟悉,其他函数我能调用,我也不知道这个为什么。于是我就写了一个静态的,外部可以直接MainWindow.show_error(str(e)),来调用,可是我本身函数如果调用的话是不可行的,因为staticmethod的缺点有很多,但是对我来说,最重要的一条是

    静态方法无法访问类的实例变量和方法,因为静态方法不会自动传递类的实例作为第一个参数。这意味着静态方法无法访问类的状态,也无法修改类的状态。

    这也就意味着,我无法使用这个方法捕获错误,来展示到错误输出上去。所以无奈暂时写两个。

    select_file,stop_script,cancel_import 这几个方法很简单了,就是导入文件、退出软件、删除导入的文件。

    get_next_word 这个方法我也折腾了一会,主要是,我的词语有两个途径,手动和文件。而且文件的词语量常常大于五十万,我目前是用一百万词量测试的。
    下面看代码:

    #简化版
    def get_next_word(self):
        if not self.words:
            QMessageBox.information(self, '提示', '文件未导入')
            return None
        else:
            word = next(self.words, None)
            print(word)
            if word is not None:
                return word
            else:
                self.task_output.insertPlainText(f'所有词语查询完毕\n')
                self.task_output.update()
                return None
    

    首先判断导入的文件是否为空,如果为空,则弹出提示框,提示用户文件未导入,并返回 None。如果导入的文件不为空,则使用 Python 的内置函数 next 从文件中获取下一个关键词,如果获取成功,则返回该关键词。如果获取失败,则表示所有关键词已经查询完毕,此时在任务输出框中插入一条提示信息,并返回 None。

    OK!写完

    本文同步 我的笔记

    End

    相关文章
    |
    1月前
    |
    数据采集 存储 XML
    Python爬虫:深入探索1688关键词接口获取之道
    在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
    |
    9天前
    |
    数据采集 人工智能 自然语言处理
    FireCrawl:开源 AI 网络爬虫工具,自动爬取网站及子页面内容,预处理为结构化数据
    FireCrawl 是一款开源的 AI 网络爬虫工具,专为处理动态网页内容、自动爬取网站及子页面而设计,支持多种数据提取和输出格式。
    66 18
    FireCrawl:开源 AI 网络爬虫工具,自动爬取网站及子页面内容,预处理为结构化数据
    |
    5天前
    |
    存储 算法 Serverless
    剖析文件共享工具背后的Python哈希表算法奥秘
    在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
    |
    4天前
    |
    数据采集 供应链 API
    Python爬虫与1688图片搜索API接口:深度解析与显著收益
    在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
    23 3
    |
    15天前
    |
    数据采集 存储 缓存
    如何使用缓存技术提升Python爬虫效率
    如何使用缓存技术提升Python爬虫效率
    |
    16天前
    |
    数据采集 Web App开发 监控
    Python爬虫:爱奇艺榜单数据的实时监控
    Python爬虫:爱奇艺榜单数据的实时监控
    |
    25天前
    |
    数据采集 JSON API
    如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
    本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
    |
    30天前
    |
    数据采集 存储 API
    利用Python爬虫获取1688关键词接口全攻略
    本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
    |
    1月前
    |
    数据可视化 编译器 Python
    Manim:数学可视化的强大工具 | python小知识
    Manim(Manim Community Edition)是由3Blue1Brown的Grant Sanderson开发的数学动画引擎,专为数学和科学可视化设计。它结合了Python的灵活性与LaTeX的精确性,支持多领域的内容展示,能生成清晰、精确的数学动画,广泛应用于教育视频制作。安装简单,入门容易,适合教育工作者和编程爱好者使用。
    311 7
    |
    1月前
    |
    数据采集 JSON 开发者
    Python爬虫京东商品详情数据接口
    京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。