最近想做一个音乐推荐系统,但是苦于没有数据,所以最近在重新捡起爬虫。写一个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):
-
- 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.add_text(url)
说到这里,笔者已经累得不行。