Python+PyQt5实现美剧爬虫可视工具的方法

时间:2021-05-22

美剧《权力的游戏》终于要开播最后一季了,作为马丁老爷子的忠实粉丝,为了能够看得懂第八季复杂庞大的剧情架构,本人想着将前几季再稳固一下,所以就上美剧天堂下载来看,可是每次都上去下载太麻烦了,于是干脆自己写个爬虫爬下来得了。

话不多说,先上图片。

本人才疏学浅,就写了个简单的可视化软件,关键是功能实现就行了嘛。

实现语言:Python ,版本 3.7.1

实现思路:首先运用 Python 工具爬取到数据再实现图形化软件。

由于这里只是实现简单的爬取数据,并没有牵扯到 cookie 之类的敏感信息,也没有设置代理,所以在选择 Python 库上并没有引入 Selenium 或者更高级的 Scrapy 框架,只是拿到数据就可以了,没必要那么麻烦。

所以选择了 urllib 这个库,在 Python 2.X 中应该是 urllib 和 urllib2 同时引入,由于本人选用的版本的 Python 3.X ,在 Python 3.X 中上面两个库已经被合并为 urllib 一个库,语法上有些不同,但语言这种东西都是大同小异的嘛。

先贴代码,缓和一下尴尬的气氛。

import urllib.requestfrom urllib import parsefrom lxml import etreeimport sslfrom PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTextEdit, QVBoxLayout, QPushButton, QMessageBoximport sys# 取消代理验证ssl._create_default_https_context = ssl._create_unverified_contextclass TextEditMeiJu(QWidget): def __init__(self, parent=None): super(TextEditMeiJu, self).__init__(parent) # 定义窗口头部信息 self.setWindowTitle('美剧天堂') # 定义窗口的初始大小 self.resize(500, 600) # 创建单行文本框 self.textLineEdit = QLineEdit() # 创建一个按钮 self.btnButton = QPushButton('确定') # 创建多行文本框 self.textEdit = QTextEdit() # 实例化垂直布局 layout = QVBoxLayout() # 相关控件添加到垂直布局中 layout.addWidget(self.textLineEdit) layout.addWidget(self.btnButton) layout.addWidget(self.textEdit) # 设置布局 self.setLayout(layout) # 将按钮的点击信号与相关的槽函数进行绑定,点击即触发 self.btnButton.clicked.connect(self.buttonClick) # 点击确认按钮 def buttonClick(self): # 爬取开始前提示一下 start = QMessageBox.information( self, '提示', '是否开始爬取《' + self.textLineEdit.text() + "》", QMessageBox.Ok | QMessageBox.No, QMessageBox.Ok ) # 确定爬取 if start == QMessageBox.Ok: self.page = 1 self.loadSearchPage(self.textLineEdit.text(), self.page) # 取消爬取 else: pass # 加载输入美剧名称后的页面 def loadSearchPage(self, name, page): # 将文本转为 gb2312 编码格式 name = parse.quote(name.encode('gb2312')) # 请求发送的 url 地址 url = "https://" + link, headers=headers) htmlDetail = urllib.request.urlopen(requestDetail).read() textDetail = etree.HTML(htmlDetail) node_listDetail = textDetail.xpath('//div[@class="tabs-list current-tab"]//strong//a/@href') self.writeDetailPage(items, node_listDetail) # 爬取完毕提示 if self.page == int(pageTotal): self.infoSearchDone() else: self.infoSearchContinue(pageTotal)

我们根据获取到的链接,再次通过 urllib 库进行页面访问,即我们手动点击进入其中的一个页面,比如 权利的游戏第一季,再次通过 xpath 获取到我们所需要的下载链接:

至此我们就将所有我们搜索到的 权力的游戏 的下载链接拿到手了,接下来就是写图形界面了。

本人选用了 PyQt5 这个框架,它内置了 QT 的操作语法,对于本人这种小白用起来也很友好。至于如何使用本人也都在代码上添加了注释,在这儿做一下简单的说明,就不过多解释了。

from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTextEdit, QVBoxLayout, QPushButton, QMessageBox, QLabelimport sys

将获取的信息写入搜索结果内:

# 将数据显示到图形界面def writeDetailPage(self, items, node_listDetail): for index, nodeLink in enumerate(node_listDetail): items["link"] = nodeLink # 写入图形界面 self.textEdit.append( "<div>" "<font color='black' size='3'>" + items['name'] + "</font>" + "\n" "<font color='red' size='3'>" + items['title'] + "</font>" + "\n" "<font color='orange' size='3'>第" + str(index + 1) + "集</font>" + "\n" "<font color='green' size='3'>下载链接:</font>" + "\n" "<font color='blue' size='3'>" + items['link'] + "</font>" "<p></p>" "</div>" )

因为可能有多页情况,所以我们得做一次判断,提示一下剩余多少页,可以选择继续爬取或停止,做到人性化交互。

# 搜索不到结果的提示信息def infoSearchNull(self): QMessageBox.information( self, '提示', '搜索结果不存在,请重新输入搜索内容', QMessageBox.Ok, QMessageBox.Ok )# 爬取数据完毕的提示信息def infoSearchDone(self): QMessageBox.information( self, '提示', '爬取《' + self.textLineEdit.text() + '》完毕', QMessageBox.Ok, QMessageBox.Ok )# 多页情况下是否继续爬取的提示信息def infoSearchContinue(self, pageTotal): end = QMessageBox.information( self, '提示', '爬取第' + str(self.page) + '页《' + self.textLineEdit.text() + '》完毕,还有' + str(int(pageTotal) - self.page) + '页,是否继续爬取', QMessageBox.Ok | QMessageBox.No, QMessageBox.No ) if end == QMessageBox.Ok: self.page += 1 self.loadSearchPage(self.textLineEdit.text(), self.page) else: pass

demo 图形化软件操作如下:

在搜索框内输入要搜索的美剧名,点击确认。提示一下是否要爬取,点击 No 不爬取,点击 OK 爬取。

判断一下是否存在搜索结果,比如吧 ”辛普森一家“ 换成了 ”吉普森一家“,搜索内容不存在。

如果搜索内容存在,在搜索完成第一页后提示一下是否需要继续爬取,点击 No 表示停止爬取,点击 OK 表示继续爬取。

最后爬取完毕后提示爬取完毕:

由于本人对 Python 了解不深,代码中有很多不足之处,需要不断学习改进,代码中有任何要改进的地方请各位大佬批评指教!

最后本人做了一套包含 Mac 和 windows 版的图形化美剧天堂抓包程序,只需要在对应电脑上点击运行即可,需要的小伙伴可以在本人的公众号后台回复美剧天堂就可以拿到了,注:在 windows 上打包生成的 .exe 软件第一打开时被 360 阻止,大家允许操作就可以了,Mac 无此提示。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章