最近想做一个音乐推荐系统,但是苦于没有数据,所以最近在重新捡起爬虫。写一个Python爬虫来搞一波事情,觉得捞月狗这个平台还不错,就花了点时间写了一个用pyqt5做UI界面的爬虫。顿时就觉得爬虫高大上了不少,诶,你懂我意思的。原来写爬虫爬过淘宝网,赶集网,58同城,还在妹子图网站开过车,就很完美。开车的话就不能说的太多,很多人会晕车的,欸,你懂我意思的。
本次爬虫基于python3.6+Beautifulsoup+pyqt5。基本上python3的版本都可以直接复制使用的。废话扯得多了,直接就上干货了。
上图就是本次爬虫要爬取的页面了,我们要做的就是爬取每个矩形框里面的数据,包括标题(titles),在线人数(nums),主播(hosts),以及直播平台(tvs)。将这四个数据分别抓取下来放在python的数据结构词典(dict)里面。具体代码如下:
-
def get_one_page(url):
-
wb_data = requests.get(url)
-
wb_data.encoding = wb_data.apparent_encoding
-
if wb_data.status_code == 200:
-
return wb_data.text
-
else:
-
return None
-
-
-
def parse_one_page(html):
-
soup = BeautifulSoup(html, 'lxml')
-
-
titles = soup.select('div.mode-box.classfiy-box div.video-pic-list ul li a div.txt h6')
-
nums = soup.select('div.mode-box.classfiy-box div.video-pic-list ul li a div.video-set span.look-icon')
-
hosts = soup.select(
-
'div.mode-box.classfiy-box div.video-pic-list ul li a div.video-set span.person-icon.subStrTitle')
-
tvs = soup.select('div.mode-box.classfiy-box div.video-pic-list ul li a div.video-set span.tv')
-
-
wb_data = []
-
for title, num, host, tv in zip(titles, nums, hosts, tvs):
-
data = {
-
'标题': title.get_text(),
-
'观看人数': num.get_text(),
-
'主播': host.get_text(),
-
'平台': tv.get_text()
-
}
-
wb_data.append(data)
-
return wb_data
get_one_page()函数主要通过requests方法获得当前网页里面的数据,然后再在parse_one_page()函数里面对获得的网页数据进行抓取。笔者用的是beautifulsoup这个很成熟的第三方库,诶顺便说一下python这个东西第三方库太多了,拥抱开源太重要了,你懂我意思的!最后将获得的wb_data返回供其他程序调用。
然后这个时候就需要一个土白土白的界面了。说起界面qt在这个方面确实做得不错,无论在C++上还是python我都极其喜欢qt。
因为本次的重点不在UI上就意思意思的做了个土肥圆的界面,搞不了花里花哨的东西,就很费力气,你懂我意思的。
上图就是抓取之后的界面了,可以看到笔者相当的懒惰,这么丑的东西怎么好意思拿出手,可是笔者这不很累吗。诶,你懂我意思。
那上面的界面如何实现了,又如何和刚才的爬虫结合起来了,这里就不得不说qt的信号槽机制了,简直就是上个时代的创新,就很皮,你知道吧。至于如何写qt的界面那就不是笔者的任务了,讲道理,笔者也只是会点皮毛。具体的代码如下:
-
class MainWindow(QMainWindow):
-
def __init__(self):
-
super().__init__()
-
-
self.setWindowTitle('捞月狗爬虫')
-
layout = QVBoxLayout()
-
self.textArea = QTextEdit()
-
button = QPushButton('开始')
-
button.pressed.connect(self.get_text)
-
-
widget = QWidget()
-
widget.setLayout(layout)
-
widget.setFixedWidth(800)
-
widget.setFixedHeight(600)
-
-
layout.addWidget(self.textArea)
-
layout.addWidget(button)
-
-
self.setCentralWidget(widget)
-
-
def add_text(self, url):
-
# url = 'http://www.laoyuegou.com/media_v2/live/index/page/1.html'
-
html = get_one_page(url)
-
wb_data = parse_one_page(html)
-
for item in wb_data:
-
self.textArea.append(str(item))
-
-
def get_text(self):
-
for i in range(1, 10):
-
url = 'http://www.laoyuegou.com/media_v2/live/index/page/' + str(i) + '.html'
-
# self.textArea.append(url)
-
self.add_text(url)
说到这里,笔者已经累得不行。