写在前面的话
学Python的初衷,就是玩一玩爬虫,搞一搞数据分析之类的。所以第一个尝试当然要尝试一下简单的初级爬虫。因为有一点计算机基础,入门也稍微轻松。
参考
第一个程序是参考前辈的教程,手把手教你写网络爬虫(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了)。
怎么说呢,仅凭我三脚猫的功夫,这个问题我怎么都无法解决,愁人。我感觉因该是写入过程出了什么问题。源代码是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(好像是这样写吧)运行的时候会跳出运行界面,后期希望修改为后台运行;代码可能还需要优化等等。