zoukankan      html  css  js  c++  java
  • selenium和phantomjs,完成豆瓣音乐排行榜的内容爬取

    代码要多敲 注释要清晰 哪怕再简单

    #使用selenium和phantomjs,完成豆瓣音乐排行榜的内容爬取
    #地址:https://music.douban.com/chart
    
    #导入需要的模块
    from selenium import webdriver
    import os
    from lxml import etree
    import time
    from bs4 import BeautifulSoup
    #生成浏览器对象
    driver = webdriver.PhantomJS()
    
    #创建文件夹存储music信息
    root_dir = 'douban_music'
    if not os.path.exists(root_dir):
        os.mkdir(root_dir)
    
    #抓取页面函数
    def spider():
        base_url = 'https://music.douban.com/chart'
        #用浏览器获取网页
        driver.get(base_url)
        #等待页面加载
        time.sleep(4)
        # 获取页面资源
        content = driver.page_source
        # print(content)
    
    
        #在解析函数中解析页面元素
        content_parser(content)
    
    def content_parser(content):
        # 用xpath解析得到的页面资源  将content生成树结构
        tree = etree.HTML(content)
        # print(tree)
        #拿取所有的歌曲列表
        music_list = tree.xpath('//ul[@class="col5"]/li[@class="clearfix"]')
        #遍历所有的歌曲列表
        for music in music_list:
    
            #拿取歌曲排名
            music_ranking = music.xpath('.//span[@class="green-num-box"]')
            #判断歌曲排名是否是非空
            if music_ranking != []:
                #获取歌曲排名文本信息
                music_ranking = music_ranking[0].text
    
            #拿取图片信息链接
            music_src = music.xpath('./a/img/@src')
            if music_src != []:
                music_src = music_src[0]
    
            #拿取歌曲名称
            music_name = music.xpath('./div/h3/a')
            if music_name != []:
                music_name = music_name[0].text
            else:
                #有一部分歌曲名的xpath路径不一样
                music_name = music.xpath('./div/p/a')[0].text
    
            #拿取singer歌手名称以及播放次数
            singer = music.xpath('./div/p')
            # print(list(singer))
            if singer != []:
                #歌手没有全部拿取
                singer = singer[0].text
    
            #拿取上榜天数
            music_days = music.xpath('./span')
    
            # 趋势
            music_trend = music_days[2].text
            if music_days != []:
                music_days = music_days[1].text
    
            #打印所有拿取到的歌曲信息
            print(music_ranking,music_src,music_name,singer,music_days,music_trend)
    
    #主进程
    if __name__ == '__main__':
        spider()
    
    '''
    music:
    <ul class="col5">
        
        <li class="clearfix">
            <span class="green-num-box">1</span>
            <a class="face" href="https://site.douban.com/baishui/" target="_blank">
                <img src="https://img3.doubanio.com/view/site/small/public/1aa014ef81b271d.jpg">
            </a>
            <div class="intro">
                <h3 class="icon-play" data-sid="721211">
                  <a href="javascript:;">另一首情歌 (feat. 袁田)</a>
                </h3>
    
                <p>白水&nbsp;/&nbsp;5748次播放</p>
            </div>
            <span class="days">(上榜11天)</span>
            <span class="trend arrow-stay"> 0 </span>
        </li>
    </ul>
    '''
  • 相关阅读:
    css取消input、select默认样式(手机端)
    Vue解决sass-loader的版本过高导致的编译错误
    在Vue项目中引入element-ui,显示结果没有样式的问题
    修改Vue项目打开指定浏览器和修改端口号
    Vue如何关闭eslint
    停止事件冒泡
    子组件中定义的方法如何传给父组件调用了呢?
    vue自定义时间过滤器之使用date-fans代替moment
    面试5(每日打卡)
    2019.10.22
  • 原文地址:https://www.cnblogs.com/zhangboblogs/p/8563758.html
Copyright © 2011-2022 走看看