快捷搜索:  汽车  科技

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单首先用火狐浏览器打开网易云音乐 登录后进入到个人主页如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python裙,关注小编,并私信“01”即可进裙,领取python学习资料,会节约很多时间,减少很多遇到的难题。用Pycharm打开这个项目首先修改配置文件setting.py1.关闭机器人协议2.取消禁用cookie的功能现在就回到爬虫文件wyySpider.py准备前期的工作修改start_urls里的网址和准备一个请求头

此货很干 跟上脚步!!!

Cookie
cookie是什么东西?
小饼干?能吃吗?
简单来说就是你第一次用账号密码访问服务器
服务器在你本机硬盘上设置一个身份识别的会员卡(cookie)
下次再去访问的时候只要亮一下你的卡片(cookie)
服务器就会知道是你来了 因为你的账号密码等信息已经刻在了会员卡上

需求分析
爬虫要访问一些私人的数据就需要用cookie进行伪装
想要得到cookie就得先登录 爬虫可以通过表单请求将账号密码提交上去
但是在火狐的F12截取到的数据就是
网易云音乐先将你的账号密码给编了码 再发post请求
所以我们在准备表单数据的时候就已经被卡住了
这时候我们就可以使用自动化测试selenium帮助我们去登录
登录好之后就获取cookie给爬虫使用

OK 废话也废话完了 直接开整吧!!
首先给我创建一个爬虫项目和爬虫
在cmd创建

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单(1)

用Pycharm打开这个项目

首先修改配置文件setting.py
1.关闭机器人协议
2.取消禁用cookie的功能

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单(2)


现在就回到爬虫文件wyySpider.py准备前期的工作
修改start_urls里的网址准备一个请求头

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python裙,关注小编,并私信“01”即可进裙,领取python学习资料,会节约很多时间,减少很多遇到的难题。

首先用火狐浏览器打开网易云音乐 登录后进入到个人主页

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单(3)

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单(4)

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单(5)

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单(6)

在爬虫代码那里准备一下 修改一下start_urls

importscrapy fromseleniumimportwebdriver fromselenium.webdriver.common.action_chainsimportActionChains importtime classWyyspiderSpider(scrapy.Spider): name='wyySpider' allowed_domains=['163.com'] start_urls=['https://music.163.com/playlist?id=19xxxxx7']

先实现一下自动登录功能获取cookie
首先导一下自动化测试的包(Selenium)
没有这个包的话去控制台:pip --default-timeout=100 install selenium -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

fromseleniumimportwebdriver fromselenium.webdriver.common.action_chainsimportActionChains importtime

导完包还要一个谷歌的驱动程序 先看一下自己的谷歌版本

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单(7)

到这网站下载相同版本的驱动程序:https://sites.google.com/a/chromium.org/Chromedriver/home

如果版本跟我的一样可以去网盘下载:
链接: https://pan.baidu.com/s/1M-gME2R8EEhEoFlPaDhbmA 提取码: 7iai

解压后记住这个驱动的位置 在爬虫文件写一个获取cookie的函数
以下代码的坐标不一定适合各位的电脑 不过给你们安利个物理外挂(电脑微信截图Alt A)

defgetCookie(self): #获取谷歌的驱动 参数为刚刚驱动程序的位置 driver=webdriver.Chrome("C:/Users/Administrator/AppData/Local/Programs/Python38/Lib/site-packages/selenium/webdriver/chrome/chromedriver.exe") #-----------------selenium自动登录----------------------- #打开谷歌然后访问指定的网站 driver.get("https://music.163.com/") #最大化 睡眠是怕网速慢没加载出来 driver.maximize_window() time.sleep(1) #鼠标从(0 0)向x(1435px) y(35px)移动 用左键点击一下 ActionChains(driver).move_by_offset(1435 35).click().perform() time.sleep(0.3) #点击其他方式 ActionChains(driver).move_by_offset(-480 575).click().perform() time.sleep(0.3) #同意条款 ActionChains(driver).move_by_offset(-218 -10).click().perform() time.sleep(0.3) #手机登录 ActionChains(driver).move_by_offset(107 -100).click().perform() time.sleep(0.3) #输入账号密码 #通过css选择器获取id为"p"的标签 然后send_keys就是模拟输入一些信息 driver.find_element_by_css_selector("#p").send_keys("账号") driver.find_element_by_css_selector("#pw").send_keys("密码") time.sleep(0.3) #点击登录 ActionChains(driver).move_by_offset(110 15).click().perform() time.sleep(1) #找到头像悬浮 img=driver.find_element_by_css_selector("div.head:nth-child(1)>img:nth-child(1)") ActionChains(driver).move_to_element(img).perform() time.sleep(0.5) #点击我的主页 ActionChains(driver).move_by_offset(0 40).click().perform() time.sleep(0.5) #点击喜欢的音乐 ActionChains(driver).move_by_offset(-870 830).click().perform() time.sleep(0.3) #-----------------selenium自动登录-----------------------

登录完毕后就可以获取cookie 但看一下下面的cookie

[{'domain':'music.163.com' 'expiry':2147483647 'httpOnly':False 'name':'WM_TID' 'path':'/' 'secure':False 'value':'UnQj6SSNqN9BEVdubmNcEjpl+9DA'} {'domain':'music.163.com' 'expiry':2147483647 'httpOnly':False 'name':'WM_NIKE' 'path':'/' 'secure':False 'value':'9ca17ae2e6ffcda170e2e6ee87f4508ef58483ea4a97968ea7c54e879a8eaaf445aebc83b6e933f3f1c0b4c82af0fea7c3b92af697b7a6dc7b82afc09ad98ca695bc5082ecbcb1e772b7889b3d1c15bf28da0bbfb5b95aa8795f073adbc9c98ed79a28d8aa7f450f1ae9dd9b77a85edbf9ac625f1ef84d8f970b4e7bfd8cd21b48e8c8ec17df3e7a898f74488ef9bb5c837e2a3'} {'domain':'.music.163.com' 'httpOnly':False 'name':'WNMCID' 'path':'/' 'sameSite':'Strict' 'secure':False 'value':'fdygqk.1611989994304.01.0'} {'domain':'.music.163.com' 'httpOnly':False 'name':'WEVNSM' 'path':'/' 'sameSite':'Strict' 'secure':False 'value':'1.0.0'} {'domain':'music.163.com' 'expiry':2147483647 'httpOnly':False 'name':'WM_NI' 'path':'/' 'secure':False 'value':'6IyEYqBqpyZMITjt9DB4tPdzuXUFC+NyOiu3S04CTC5Nsv2Q4gkMM0BQ2SPZxQWvItmyodTwnsbSFFqD3rS84rG3qyG/31L7zdp9q7N+pRDmBw19hwtHD1UTE='} {'domain':'.music.163.com' 'expiry':1927349994 'httpOnly':False 'name':'NMTID' 'path':'/' 'secure':False 'value':'00O-pWx8ZDJJQfiFkHzsgin07nYSmUAAAF3UhdN2w'} {'domain':'.163.com' 'expiry':4765589994 'httpOnly':False 'name':'_ntes_nuid' 'path':'/' 'secure':False 'value':'738fc9cd89d6d8799fa76b3348d25d7d'} {'domain':'.163.com' 'expiry':4765589994 'httpOnly':False 'name':'_ntes_nnid' 'path':'/' 'secure':False 'value':'738fc9cd89d6d8799fa76b3348d25d7d 1611989994150'} {'domain':'.music.163.com' 'expiry':1769671794 'httpOnly':False 'name':'_iuqxldmzr_' 'path':'/' 'secure':False 'value':'32'} {'domain':'.music.163.com' 'expiry':1769671794 'httpOnly':False 'name':'JSESSIONID-WYYY' 'path':'/' 'secure':False 'value':'OoCMxNwGV\fZD2OSzAXovf4ASVZsJ8UQ4sgg7JfH075cKTD/W3sMzZj+payS1EnNVXzRm/2GxfzIoNv3FTjYxKeNFZWqf6UeiMSc1+G98kgsEM94juuE\s18k2+PNPAp3hU0G\FDUtjkimCR5pgOIOI:1611991794102'}]

是列表加字典的结构 而Scrapy的cookie是字符串类型的 所以我们要做一个转型

#将driver获取的字典类型的cookie提取name和value封装成字符串 temp=[] foriindriver.get_cookies(): temp.append(i['name'] "=" i['value']) #返回字符串cookie return';'.join(temp)

所以这个函数基本就写完了 自动登录后获取cookie是不是很爽!!!
现在重写一下def start_requests(self) 这个函数是在请求发起前执行的

在这个函数把请求头给塞进去 因为setting那边没有定义

defstart_requests(self): #定义请求头的时候调用一下getCookie获取一下cookie headers={ 'Cookie':self.getCookie() 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML likeGecko)Chrome/88.0.4324.104Safari/537.36' } #注意url是个列表这里拿下标[0] 然后把headers请求头塞进去 交给parse函数 yieldscrapy.Request(url=self.start_urls[0] headers=headers callback=self.parse)

请求前一切准备好之后 在解析函数(parse)进行保存一下数据 记得到re包

defparse(self response): #匹配歌曲名的正则表达式 patt=re.compile(r'<ahref="/song.id=.*?">([^<|{]*?)</a>') #找到所有歌曲名 listdata=re.findall(patt response.text) #把数据写进txt文件 withopen(file="../response.txt" mode="w " encoding="utf-8")asfile: foriteminlistdata: file.write(item "\n")

一句启动爬虫的命令 眨眨眼的时间 ~
数据就进去了哦!原来我的喜爱歌单只有不到500~

python爬取网易云vip音乐:看我如何用Python爬取网易云音乐歌单(8)

下面就是爬虫源代码

importscrapy fromseleniumimportwebdriver fromselenium.webdriver.common.action_chainsimportActionChains importtime importre classWyyspiderSpider(scrapy.Spider): name='wyySpider' allowed_domains=['163.com'] start_urls=['https://music.163.com/playlist?id=19xxxxx7'] defgetCookie(self): #获取谷歌的驱动 参数为刚刚驱动程序的位置 driver=webdriver.Chrome("C:/Users/Administrator/AppData/Local/Programs/Python38/Lib/site-packages/selenium/webdriver/chrome/chromedriver.exe") #-----------------selenium自动登录----------------------- #打开谷歌然后访问指定的网站 driver.get("https://music.163.com/") #最大化 睡眠是怕网速慢没加载出来 driver.maximize_window() time.sleep(1) #以下坐标以自己的电脑为准 #鼠标从(0 0)向x(1435px) y(35px)移动 用左键点击一下 ActionChains(driver).move_by_offset(1435 35).click().perform() time.sleep(0.3) #点击其他方式 ActionChains(driver).move_by_offset(-480 575).click().perform() time.sleep(0.3) #同意条款 ActionChains(driver).move_by_offset(-218 -10).click().perform() time.sleep(0.3) #手机登录 ActionChains(driver).move_by_offset(107 -100).click().perform() time.sleep(0.3) #输入账号密码 #通过css选择器获取id为"p"的标签 然后send_keys就是模拟输入一些信息 driver.find_element_by_css_selector("#p").send_keys("账号") driver.find_element_by_css_selector("#pw").send_keys("密码") time.sleep(0.3) #点击登录 ActionChains(driver).move_by_offset(110 15).click().perform() time.sleep(1) #找到头像悬浮 img=driver.find_element_by_css_selector("div.head:nth-child(1)>img:nth-child(1)") ActionChains(driver).move_to_element(img).perform() time.sleep(0.5) #点击我的主页 ActionChains(driver).move_by_offset(0 40).click().perform() time.sleep(0.5) ##点击喜欢的音乐 #ActionChains(driver).move_by_offset(-870 830).click().perform() #time.sleep(0.3) #-----------------selenium自动登录----------------------- #将driver获取的字典类型的cookie提取name和value封装成字符串 #临时存放每个拼接好的key=value字符串 temp=[] #遍历driver给的cookies字典 foriindriver.get_cookies(): temp.append(i['name'] "=" i['value']) #返回字符串cookie return';'.join(temp) defstart_requests(self): #定义请求头的时候调用一下getCookie获取一下cookie headers={ 'Cookie':self.getCookie() 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML likeGecko)Chrome/88.0.4324.104Safari/537.36' } #注意url是个列表这里拿下标[0] 然后把headers请求头塞进去 交给parse函数 yieldscrapy.Request(url=self.start_urls[0] headers=headers callback=self.parse) defparse(self response): #匹配歌曲名的正则表达式 patt=re.compile(r'<ahref="/song.id=.*?">([^<|{]*?)</a>') #找到所有歌曲名 listdata=re.findall(patt response.text) #把数据写进txt文件 withopen(file="response.txt" mode="w " encoding="utf-8")asfile: foriteminlistdata: file.write(item "\n")

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

猜您喜欢: