Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单


Posted in Python onFebruary 01, 2021

此货很干,跟上脚步!!!
Cookie
cookie是什么东西?
小饼干?能吃吗?
简单来说就是你第一次用账号密码访问服务器
服务器在你本机硬盘上设置一个身份识别的会员卡(cookie)
下次再去访问的时候只要亮一下你的卡片(cookie)
服务器就会知道是你来了,因为你的账号密码等信息已经刻在了会员卡上
需求分析
爬虫要访问一些私人的数据就需要用cookie进行伪装
想要得到cookie就得先登录,爬虫可以通过表单请求将账号密码提交上去
但是在火狐的F12截取到的数据就是,
网易云音乐先将你的账号密码给编了码,再发post请求
所以我们在准备表单数据的时候就已经被卡住了
这时候我们就可以使用自动化测试Selenium帮助我们去登录
登录好之后就获取cookie给爬虫使用

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

Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单

用Pycharm打开这个项目

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

Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单

现在就回到爬虫文件wyySpider.py准备前期的工作
修改start_urls里的网址准备一个请求头
首先用火狐浏览器打开网易云音乐,登录后进入到个人主页

Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单

Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单

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

import scrapy
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

class WyyspiderSpider(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

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

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

Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单

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

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

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

def getCookie(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%2B9DA'}, {'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%2BNyOiu3S04CTC5Nsv2Q4gkMM0BQ2SPZxQWvItmyodTwnsbSFFqD3rS84rG3qyG%2F31L7zdp9q7N%2BpRDmBw19hwtHD1UTE%3D'}, {'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%5CfZD2OSzAXovf4ASVZsJ8UQ4sgg7JfH075cKTD%2FW3sMzZj%2BpayS1EnNVXzRm%2F2GxfzIoNv3FTjYxKeNFZWqf6UeiMSc1%2BG98kgsEM94juuE%5Cs18k2%2BPNPAp3hU0G%5CFDUtjkimCR5pgOIOI%3A1611991794102'}]

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

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

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

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

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

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

def parse(self, response):
    # 匹配歌曲名的正则表达式
    patt = re.compile(r'<a href="/song.id=.*?">([^<|{]*?)</a>')

    # 找到所有歌曲名
    listdata = re.findall(patt, response.text)
    
    # 把数据写进txt文件
    with open(file="../response.txt", mode="w+", encoding="utf-8") as file:
      for item in listdata:
        file.write(item+"\n")

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

Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单

下面就是爬虫源代码

import scrapy
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
import re

class WyyspiderSpider(scrapy.Spider):
  name = 'wyySpider'
  allowed_domains = ['163.com']
  start_urls = ['https://music.163.com/playlist?id=19xxxxx7']

  def getCookie(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字典
    for i in driver.get_cookies():
      temp.append(i['name'] + "=" + i['value'])

    # 返回字符串cookie
    return ';'.join(temp)

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

  def parse(self, response):
    # 匹配歌曲名的正则表达式
    patt = re.compile(r'<a href="/song.id=.*?">([^<|{]*?)</a>')

    # 找到所有歌曲名
    listdata = re.findall(patt, response.text)

    # 把数据写进txt文件
    with open(file="response.txt", mode="w+", encoding="utf-8") as file:
      for item in listdata:
        file.write(item+"\n")

到此这篇关于Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单的文章就介绍到这了,更多相关Scrapy+Selenium爬取网易云音乐内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现批量转换文件编码(批转换编码示例)
Jan 23 Python
python编写的最短路径算法
Mar 25 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
利用arcgis的python读取要素的X,Y方法
Dec 22 Python
python list多级排序知识点总结
Oct 23 Python
基于keras 模型、结构、权重保存的实现
Jan 24 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
python3爬虫中异步协程的用法
Jul 10 Python
用Python爬取某乎手机APP数据
Jun 15 Python
python中xlrd模块的使用详解
Feb 01 #Python
python中使用np.delete()的实例方法
Feb 01 #Python
flask框架中的cookie和session使用
Jan 31 #Python
Flask处理Web表单的实现方法
Jan 31 #Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 #Python
Django中template for如何使用方法
Jan 31 #Python
python中os.remove()用法及注意事项
Jan 31 #Python
You might like
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
javascript 播放器 控制
2007/01/22 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
vue实现计步器功能
2019/11/01 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
django2 快速安装指南分享
2018/01/05 Python
Python学生信息管理系统修改版
2018/03/13 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
Python文件操作方法详解
2020/02/09 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
职业教育毕业生求职信
2013/11/09 职场文书
优良学风班总结材料
2014/02/08 职场文书
总账会计岗位职责
2014/03/13 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
法制演讲稿
2014/09/10 职场文书
法人委托书的范本格式
2014/09/11 职场文书
2014年绿化工作总结
2014/12/09 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers