python爬虫之爬取捞月狗直播信息

来源:互联网 发布:怎么开淘宝网店2016 编辑:程序博客网 时间:2024/04/27 23:06

最近想做一个音乐推荐系统,但是苦于没有数据,所以最近在重新捡起爬虫。写一个Python爬虫来搞一波事情,觉得捞月狗这个平台还不错,就花了点时间写了一个用pyqt5做UI界面的爬虫。顿时就觉得爬虫高大上了不少,诶,你懂我意思的。原来写爬虫爬过淘宝网,赶集网,58同城,还在妹子图网站开过车,就很完美。开车的话就不能说的太多,很多人会晕车的,欸,你懂我意思的。

本次爬虫基于python3.6+Beautifulsoup+pyqt5。基本上python3的版本都可以直接复制使用的。废话扯得多了,直接就上干货了。


上图就是本次爬虫要爬取的页面了,我们要做的就是爬取每个矩形框里面的数据,包括标题(titles),在线人数(nums),主播(hosts),以及直播平台(tvs)。将这四个数据分别抓取下来放在python的数据结构词典(dict)里面。具体代码如下:

[python] view plain copy
  1. def get_one_page(url):  
  2.     wb_data = requests.get(url)  
  3.     wb_data.encoding = wb_data.apparent_encoding  
  4.     if wb_data.status_code == 200:  
  5.         return wb_data.text  
  6.     else:  
  7.         return None  
  8.   
  9.   
  10. def parse_one_page(html):  
  11.     soup = BeautifulSoup(html, 'lxml')  
  12.   
  13.     titles = soup.select('div.mode-box.classfiy-box div.video-pic-list ul li a div.txt h6')  
  14.     nums = soup.select('div.mode-box.classfiy-box div.video-pic-list ul li a div.video-set span.look-icon')  
  15.     hosts = soup.select(  
  16.         'div.mode-box.classfiy-box div.video-pic-list ul li a div.video-set span.person-icon.subStrTitle')  
  17.     tvs = soup.select('div.mode-box.classfiy-box div.video-pic-list ul li a div.video-set span.tv')  
  18.   
  19.     wb_data = []  
  20.     for title, num, host, tv in zip(titles, nums, hosts, tvs):  
  21.         data = {  
  22.             '标题': title.get_text(),  
  23.             '观看人数': num.get_text(),  
  24.             '主播': host.get_text(),  
  25.             '平台': tv.get_text()  
  26.         }  
  27.         wb_data.append(data)  
  28.     return wb_data  


get_one_page()函数主要通过requests方法获得当前网页里面的数据,然后再在parse_one_page()函数里面对获得的网页数据进行抓取。笔者用的是beautifulsoup这个很成熟的第三方库,诶顺便说一下python这个东西第三方库太多了,拥抱开源太重要了,你懂我意思的!最后将获得的wb_data返回供其他程序调用。

然后这个时候就需要一个土白土白的界面了。说起界面qt在这个方面确实做得不错,无论在C++上还是python我都极其喜欢qt。


因为本次的重点不在UI上就意思意思的做了个土肥圆的界面,搞不了花里花哨的东西,就很费力气,你懂我意思的。



上图就是抓取之后的界面了,可以看到笔者相当的懒惰,这么丑的东西怎么好意思拿出手,可是笔者这不很累吗。诶,你懂我意思。

那上面的界面如何实现了,又如何和刚才的爬虫结合起来了,这里就不得不说qt的信号槽机制了,简直就是上个时代的创新,就很皮,你知道吧。至于如何写qt的界面那就不是笔者的任务了,讲道理,笔者也只是会点皮毛。具体的代码如下:

[python] view plain copy
  1. class MainWindow(QMainWindow):  
  2.     def __init__(self):  
  3.         super().__init__()  
  4.   
  5.         self.setWindowTitle('捞月狗爬虫')  
  6.         layout = QVBoxLayout()  
  7.         self.textArea = QTextEdit()  
  8.         button = QPushButton('开始')  
  9.         button.pressed.connect(self.get_text)  
  10.   
  11.         widget = QWidget()  
  12.         widget.setLayout(layout)  
  13.         widget.setFixedWidth(800)  
  14.         widget.setFixedHeight(600)  
  15.   
  16.         layout.addWidget(self.textArea)  
  17.         layout.addWidget(button)  
  18.   
  19.         self.setCentralWidget(widget)  
  20.   
  21.     def add_text(self, url):  
  22.         # url = 'http://www.laoyuegou.com/media_v2/live/index/page/1.html'  
  23.         html = get_one_page(url)  
  24.         wb_data = parse_one_page(html)  
  25.         for item in wb_data:  
  26.             self.textArea.append(str(item))  
  27.   
  28.     def get_text(self):  
  29.         for i in range(110):  
  30.             url = 'http://www.laoyuegou.com/media_v2/live/index/page/' + str(i) + '.html'  
  31.             # self.textArea.append(url)  
  32.             self.add_text(url)  

说到这里,笔者已经累得不行。