私家文档,仅供参考!

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


软件介绍

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

操作流程:

graph TD
手动输入关键词 --> 页数
导入文件 --> 页数--> 履行--> 新建文件而且刺进数据

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

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

这款桌面端运用现在的功用包含但不限于:分词循环爬取查找导入文件爬取软件设置在线更新使命/过错捕获输出当前进展自动更新署理

运用技能及三方库

言语运用的是 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