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实现udp数据报传输的方法
Sep 26 Python
Python中多线程及程序锁浅析
Jan 21 Python
利用Python演示数型数据结构的教程
Apr 03 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
TensorFlow Session会话控制&amp;Variable变量详解
Jul 30 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
如何使用PyCharm及常用配置详解
Jun 03 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
域名查询代码公布
2006/10/09 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
PHP支付宝当面付2.0代码
2018/12/21 PHP
js 获取服务器控件值的代码
2010/03/05 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
js验证账户名是否重复
2020/05/26 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
python实现电脑自动关机
2018/06/20 Python
python版本单链表实现代码
2018/09/28 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
大学毕业生工作的自我评价
2013/10/01 职场文书
暑期实践思想汇报
2014/01/06 职场文书
工厂实习感言
2014/01/14 职场文书
一年级家长会邀请函
2014/01/25 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
最美家庭活动方案
2014/08/31 职场文书
颐和园的导游词
2015/01/30 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB