之前的nba site的基础建设做得七七八八差不多了,不过没有什么内容文章,所以在琢磨着是否定时可以从其他网站上来爬取文章进行自己站点的填充,所以准备学一点爬虫.
关于基础的urllib.request和BeautifulSoup等基础库的使用,这里就不详细说了,任何一本书籍的前置部分都会有讲解。
我这里直接使用selenium和chromedriver来进行抓取
这样做的好处是,很多网站他并不是纯静态网站,可以让你随意抓取,很多通过JS等方式异步加载的内容,你是普通抓取不到的。
1:环境配置
selenium的安装可以直接通过pycharm来安装
chromedriver的话,需要先去官网下载.
https://chromedriver.storage.googleapis.com/index.html
首先要看自己chrome的版本是多少,然后决定下载哪个版本的chromedriver
我是macos平台,所以下载解压之后,直接放到/usr/local/bin里面就好
测试方法:在命令行输入chromedriver有效果就好
2:网页元素分析及编写抓取代码
目标网址: https://music.163.com/#/discover/playlist/
我们的目标是:爬取所有播放数量超过500万的歌单的名字+播放数+链接地址
通过chrome调试工具,我们可以很容易得看到,歌单的播放数,是class='nb' 后面的内容,而歌单的地址则是class='msk'的内容
from selenium import webdriver
import csv,codecs
#网易云音乐歌单第一页的url
url = 'https://music.163.com/#/discover/playlist/'
#用Chromedriver接口创建一个webdriver
driver = webdriver.Chrome()
#准备好储存歌单的csv文件
csv_file = codecs.open('playlist.csv','w','utf_8_sig')
writer = csv.writer(csv_file)
writer.writerow(['标题','播放数','链接'])
page = 0
#解析每一页,知道下一页为空
while page < 3: #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')
#把封面上的标题和链接连同播放数一起写入到文件中
writer.writerow([msk.get_attribute('title'),nb,msk.get_attribute('href')])
#定位下一页的url
url = driver.find_element_by_css_selector('a.zbtn.znxt').get_attribute('href')
page += 1
csv_file.close()
原来的参考资料里面,他是将所有页面全部爬取,判断条件就是下一页的url是否是javascript:void(0),不过因为这样一抓取,需要遍历将近40页,所以我就自行添加了一个page参数,只循环2页而已。
3:遇到的乱码问题
抓取后得到的csv文件,里面中文全是乱码,应该是编码出现了问题,google了好久,主要原因是mac平台下,生成的csv文件默认是uft-8编码,而excel则是对应gbk编码,所以如果你用mac里面的numbers打开这个csv,是没有问题的,但是excel打开就乱码。
尝试过在open函数里面设置encoding参数为gbk,但是这样的结果是excel打开没问题了,numbers打开又乱码了,总感觉不是很靠谱。
之后看到一个方法,引入python自带的codecs库,如下编写。
csv_file = codecs.open('playlist.csv','w','utf_8_sig')
随后测试成功,无论excel还是numbers打开都没有问题。
网友评论