【Python自学记二】我的第一个Python爬虫——网易云音乐歌单

写在前面的话
学Python的初衷,就是玩一玩爬虫,搞一搞数据分析之类的。所以第一个尝试当然要尝试一下简单的初级爬虫。因为有一点计算机基础,入门也稍微轻松。
参考
第一个程序是参考前辈的教程,手把手教你写网络爬虫(1):网易云音乐歌单,教程不是最新的,期间有好几个坑,埋了好久才出来。。。本文仅是对教程的一些个人补充,请先学习前辈的教程。我是站在巨人的肩膀上学习。
这个图深得我心~哈哈
拿起键盘就是干
学习
按部就班敲代码,运行之后就会发现一些问题了,记录自己遇到的问题以及解决方式,要让我的第一个爬虫爬起来啊。。。
第一个坑:

  1. warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless
    selenium+PhantomJS 这种用法已经过时了,PhantomJS 很久没更新了,被弃用。
    解决方法:
    改用selenium+Firefox或者chrome,因为我电脑上用的是chrome浏览器,所以计划用selenium+chrome。
    我们需要安装一个 ChromeDriver 才能驱动 Chrome 浏览器完成相应的操作。
    打开 ChromeDriver 的官方网站,链接为:https://sites.google.com/a/chromium.org/chromedriver/downloads。下载对应浏览器版本的Chromedriver。更多安装详情可以参考:1.2.3 ChromeDriver的安装
    把PhantomJS调用改为
driver=webdriver.Chrome()

第二个坑
2. UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xbb’ in position 8530: illegal multibyte sequence 说是什么默认编码的问题,也不知道别的系统会不会遇到这个问题,我的是Win10.
解决方法:
改变标准输出的默认编码。参考:解决python3 UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xXX’ in position XX

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')         #改变标准输出的默认编码

第三个坑:
3. OutStream’ object has no attribute ‘buffer’ 这个可是真真实实折腾了我一晚上,我也不知道怎么搞,尝试了好多次,也没弄明白。之前程序已经可以开始运行了,运行到一半就报错。
解决办法:
了解:Python异常类 Python是面向对象语言,所以程序抛出的异常也是类。常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不用Python了)。
Python异常类
怎么说呢,仅凭我三脚猫的功夫,这个问题我怎么都无法解决,愁人。我感觉因该是写入过程出了什么问题。源代码是csv的一个读写过程,我在想能不能换个读写过程代码。
随后在查阅的过程中,了解到另一种excel读写方式:

from openpyxl import workbook

更多openpyxl教程:用python读写excel的强大工具:openpyxl Working with Excel Spreadsheets,mark,下次要学习学习。

根据示例,利用三脚猫功夫修改了一下:

# -*- coding: utf-8 -*-
"""
Created on Sat Jun 22 22:56:50 2019

@author: Kevin You
"""
from openpyxl import Workbook
from selenium import webdriver

url='https://music.163.com/#/discover/playlist'
driver=webdriver.Chrome()

wb = Workbook()

# grab the active worksheet
ws = wb.active

# Data can be assigned directly to cells
ws['A1'] = '标题'
ws['B1'] = '播放数'
ws['C1'] = '链接'

# Rows can also be appended
#解析每一个网页,直到‘下一页’为空
while url !='javascript:void(0)':
    #用webdriver加载页面
    driver.get(url)
    #切换到内容的iframe
    driver.switch_to.frame("contentFrame")
    #定位歌单标签
    data=driver.find_element_by_id("m-pl-container").\
    find_elements_by_tag_name("li")
    #解析一页中的所有歌单
    for i in range(len(data)):
        #获取播放数
        nb=data[i].find_element_by_class_name("nb").text
        if '万' in nb and int(nb.split("万")[0])>500:
            #获取播放数大于500万的歌单的封面
            msk=data[i].find_element_by_css_selector("a.msk")
            ##把封面上的标题和链接连同播放次数一起写到文件中
            #sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
            ws.append([msk.get_attribute('title'),nb,msk.get_attribute('href')])
#            print([msk.get_attribute('title'),nb,msk.get_attribute('href')])
    #定位‘下一页’的url
    url=driver.find_element_by_css_selector("a.zbtn.znxt").\
    get_attribute('href')

# Save the file
wb.save("sample.xlsx")

第一个爬虫小程序成功顺利跑起来了!感谢各位前辈的教程。期间遇到很多问题,能力有限,没有直接解决了解,希望在后期的学习中,逐个了解更加深入。
在这里插入图片描述
当然,这个程序还是有改进的地方,比如chrome headless(好像是这样写吧)运行的时候会跳出运行界面,后期希望修改为后台运行;代码可能还需要优化等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值