标准步骤
实现爬虫代码一般分为以下几个步骤:
1. 确定爬取网站的 URL
2. 获取HTML源代码
3. 解析HTML源代码,提取所需信息
4. 存储爬取到的数据
在使用Python编写爬虫代码时,需要使用一些第三方库来协助完成上述步骤,比如爬取网站的URL可以使用requests
库,获取HTML源代码则可以使用BeautifulSoup
库等。
而使用PyQt5将爬虫实现为GUI程序,则可以让用户通过界面来指定要爬取的网站以及所需信息,增加了程序的交互性。
具体实现
下面是一个用PyQt5实现的爬虫程序的示例代码。该程序可以让用户输入一个电影名,然后从一个电影评论网站上获取该电影的评论,并将评论显示在程序中。
import requests
from bs4 import BeautifulSoup
from PyQt5.QtWidgets import QGridLayout, QApplication, QLineEdit, QTextEdit, QWidget, QLabel, QPushButton
import sys
class Spider(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
grid = QGridLayout()
self.setLayout(grid)
nameLabel = QLabel('电影名称:')
self.nameEdit = QLineEdit()
button = QPushButton('开始爬取')
resultLabel = QLabel('搜索结果:')
self.resultEdit = QTextEdit()
grid.addWidget(nameLabel, 1, 0)
grid.addWidget(self.nameEdit, 1, 1)
grid.addWidget(button, 2, 0, 1, 2)
grid.addWidget(resultLabel, 3, 0)
grid.addWidget(self.resultEdit, 4, 0, 1, 2)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('电影评论爬虫')
self.show()
button.clicked.connect(self.spider)
def spider(self):
name = self.nameEdit.text()
url = 'https://movie.douban.com/subject_search?search_text=' + name + '&cat=1002'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/89.0.4389.82 Safari/537.36'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
content = soup.select('.title')
if len(content) == 0:
self.resultEdit.setText('没有找到电影:' + name)
else:
for c in content:
href = c.select_one('a')['href']
comment_url = href.replace('subject', 'comments') + 'hotest'
comment_response = requests.get(comment_url, headers=headers)
comment_soup = BeautifulSoup(comment_response.text, 'html.parser')
comments = comment_soup.select('.comment > p')
for comment in comments:
self.resultEdit.append(comment.text)
self.resultEdit.append('-' * 50)
if __name__ == '__main__':
app = QApplication(sys.argv)
spider = Spider()
sys.exit(app.exec_())
该示例程序在GUI中提供了一个输入框用来输入电影名称,并提供一个按钮来开始爬取。爬取的结果会以文本框的形式展示在GUI中。
我们以输入“阿甘正传”为例来解析这个示例程序的实现过程。
首先,我们需要获取豆瓣电影中电影阿甘正传的URL,我们可以使用requests库来获取该URL:
name = '阿甘正传'
url = 'https://movie.douban.com/subject_search?search_text=' + name + '&cat=1002'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/89.0.4389.82 Safari/537.36'
}
response = requests.get(url, headers=headers)
其中headers是用来伪装成浏览器访问网站避免被封禁。
接着,我们需要解析HTML源代码,提取评论信息。这里我们使用BeautifulSoup库:
soup = BeautifulSoup(response.text, 'html.parser')
content = soup.select('.title')
content
表示解析出的所有电影名称及其对应URL的HTML代码块。可以通过查看网页源代码,我们可以发现电影名称都是包含在<span class="title">
标签中,因此我们使用.select('.title')
来选取这些标签。
在解析出相应的URL之后,我们再次使用requests库来获取该电影的评论:
href = c.select_one('a')['href']
comment_url = href.replace('subject', 'comments') + 'hotest'
comment_response = requests.get(comment_url, headers=headers)
comment_soup = BeautifulSoup(comment_response.text, 'html.parser')
comments = comment_soup.select('.comment > p')
其中,href
是该电影的URL,我们需要将其中的subject
替换为comment
来获取该电影的评论页面URL。comments
表示解析出的该电影所有热门评论。
最后,将提取到的评论信息显示在GUI中:
for comment in comments:
self.resultEdit.append(comment.text)
self.resultEdit.append('-' * 50)
其中,self.resultEdit
为文本框控件的对象,通过.append()
方法来向文本框中添加评论信息。
示例说明
由于爬虫涉及到网络请求和HTML解析等操作,因此爬虫程序执行时需要一定的时间。在实际应用中,为了避免程序长时间卡顿,我们可以考虑开启线程或进程让爬虫程序异步运行。
在上述示例程序中,如果用户输入的电影名称在豆瓣电影中不存在,则程序会弹出一个对话框提示用户没有找到该电影。如果我们想要在爬虫失败时能够提供更加详细的提示信息,可以在程序中增加异常处理来捕获爬虫失败的情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python PyQt5 爬虫实现代码 - Python技术站