爬虫之突破xm-sign校验反爬
喜马拉雅
网页分析
- 打开我们要爬取的音乐专辑https://www.ximalaya.com/ertong/424529/
- F12打开开发者工具
- 点击XHR 随便点击一首歌曲会看到存储所有歌曲的地址【json格式】
- 正常情况下我们直接用requests请求上面的地址就可以直接获取歌曲的所有信息
- 我们拿着上面获取的地址向浏览器发起请求,发现没有返回任何信息
- 我们查看请求头中的信息发现有一个xm-sign参数,值为加密后的字符串,就是这个参数使我们获取不到数据
- 31a0dbb5916dfe85d62d8fa5988efc43(36)1563537528652(26)1563537531252
- 后面的时间戳为服务器时间戳和系统当前时间戳,计算过期时间
- 我们分析出xm-sign参数的加密规则,每次请求都在headers加上我们自己生成的xm-sign参数即可
加密方式:
ximalaya-时间戳(sha1加密) + (100以内随机生成一个数) + 服务器时间 + (100以内随机生成一个数) + 系统当前时间 校验方式:
ximalaya-时间戳(sha1加密) + 服务器时间
获取地址
请求地址
告诉我们没有标志,此时感觉我们在请求时少了点参数,去查看请求头
查看请求头
后端逻辑代码
- 下载安装node.js https://nodejs.org/en/download/ 安装方式:https://blog.csdn.net/cai454692590/article/details/86093297
- 获取服务器时间戳
- 调用js代码中的函数生成xm-sign参数
- 在headrs中加上生成的xm-sign参数像浏览器发起请求
- 获取数据进行持久化
js代码需要改的
目标地址:
加密方式:
代码实现
安装pyexecjs模块
pip install pyexecjs
# -*- coding: utf-8 -*-
# @Time : 2019/7/19 19:05
import requests
import os
import re
from bs4 import BeautifulSoup
import lxml
import json
import execjs # 操作js代码的库 headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
'Accept': 'text/html,application/xhtml+ xml,application/xml;q = 0.9,image/webp,image/apng,*/*;q=0.8, application/signe-exchange;v = b3',
'Host': 'www.ximalaya.com'
} '''爬取喜马拉雅服务器系统时间戳,用于生成xm-sign'''
def getxmtime():
url="https://www.ximalaya.com/revision/time"
response = requests.get(url, headers=headers)
html = response.text
return html '''利用xmSign.js生成xm-sign'''
def exec_js():
#获取喜马拉雅系统时间戳
time = getxmtime() #读取同一路径下的js文件
with open('xmSign.js',"r",encoding='utf-8') as f:
js = f.read() # 通过compile命令转成一个js对象
docjs = execjs.compile(js)
# 调用js的function生成sign
res = docjs.call('python',time)
return res """获取专辑一共有多少页"""
def getPage():
url = "https://www.ximalaya.com/ertong/424529/"
html = requests.get(url,headers=headers).text
# 创建BeautifulSoup对象
suop = BeautifulSoup(html,'lxml') # 实例化对象,使用lxml进行解析
# 根据属性获取 最大页码
max_page = suop.find("input",placeholder="请输入页码").attrs["max"]
return max_page response_list = []
"""请求歌曲源地址"""
def gethtml():
# 调用exec_js函数生成xm-sign
xm_sign = exec_js()
# 将生成的xm-sign添加到请求投中
headers["xm-sign"] = xm_sign
max_page = getPage()
for page in range(1,int(max_page)+1):
url = "https://www.ximalaya.com/revision/play/album?albumId=424529&pageNum={}&sort=1&pageSize=30".format(page)
# 下载
response= requests.get(url,headers=headers).text
response = json.loads(response)
response_list.append(response) """数据持久化"""
def write_data():
# 请求歌曲地址拿到响应数据json
gethtml()
for res in response_list:
data_list = res["data"]["tracksAudioPlay"]
for data in data_list:
trackName = data["trackName"] # 歌名
trackCoverPath = data["trackCoverPath"] # 封面地址
music_path = data["src"] # url
print(trackName,trackCoverPath,music_path)
write_data()
下载音频
爬虫之突破xm-sign校验反爬的更多相关文章
- python爬虫的一个常见简单js反爬
python爬虫的一个常见简单js反爬 我们在写爬虫是遇到最多的应该就是js反爬了,今天分享一个比较常见的js反爬,这个我已经在多个网站上见到过了. 我把js反爬分为参数由js加密生成和js生成coo ...
- Python爬虫入门教程 63-100 Python字体反爬之一,没办法,这个必须写,反爬第3篇
背景交代 在反爬圈子的一个大类,涉及的网站其实蛮多的,目前比较常被爬虫coder欺负的网站,猫眼影视,汽车之家,大众点评,58同城,天眼查......还是蛮多的,技术高手千千万,总有五花八门的反爬技术 ...
- 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第六节:反爬策略研究
之前的章节也略有提及反爬策略,本节,我们就来系统的对反爬.反反爬的种种,做一个了结. 从防盗链说起: 自从论坛兴起的时候,网上就有很多人会在论坛里发布一些很棒的文章,与当下流行的“点赞”“分享”一样, ...
- python 爬虫 汽车之家车辆参数反爬
水平有限,仅供参考. 如图所示,汽车之家的车辆详情里的数据做了反爬对策,数据被CSS伪类替换. 观察 Sources 发现数据就在当前页面. 发现若干条进行CSS替换的js 继续深入此JS 知道了数据 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
- python爬虫--爬虫与反爬
爬虫与反爬 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬技术将普通用户识别为爬虫,从而限制其访问,如果误伤过高,反爬效果再好也不能使用(例如封i ...
- 简单爬虫,突破IP访问限制和复杂验证码,小总结
简单爬虫,突破复杂验证码和IP访问限制 文章地址:http://www.cnblogs.com/likeli/p/4730709.html 好吧,看题目就知道我是要写一个爬虫,这个爬虫的目标网站有 ...
- 常见的反爬措施:UA反爬和Cookie反爬
摘要:为了屏蔽这些垃圾流量,或者为了降低自己服务器压力,避免被爬虫程序影响到正常人类的使用,开发者会研究各种各样的手段,去反爬虫. 本文分享自华为云社区<Python爬虫反爬,你应该从这篇博客开 ...
- 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案
Python爬虫总结 总的来说,Python爬虫所做的事情分为两个部分,1:将网页的内容全部抓取下来,2:对抓取到的内容和进行解析,得到我们需要的信息. 目前公认比较好用的爬虫框架为Scrapy,而且 ...
随机推荐
- [VS]VS2017 安装ReportDesigner/ReportViewer的方法
原文:[VS]VS2017 安装ReportDesigner/ReportViewer的方法 解决安装完VS2017后,无法用ReportDesigner/ReportViewer打开.rdlc文件V ...
- UWP开发:获取用户当前所在的网络环境(WiFi、移动网络、LAN…)
原文:UWP开发:获取用户当前所在的网络环境(WiFi.移动网络.LAN-) UWP开发:获取用户当前所在的网络环境: 在uwp开发中,有时候,我们需要判断用户所在的网络,是WiFi,还是移动网络,给 ...
- C#整数类型
C#支持9种整数类型,sbyte,byte,short,ushort,int,uint,long,ulong和char. 类型 含义 ...
- Windows应用程序文件说明
bin文件夹:包含debug子目录,含有.exe可执行文件和pdb文件,其中pdb文件包含完整的调试信息(包含函数原型): obj文件夹:包含debug子目录,含有编译过程中生成的中间代码. Prop ...
- CNN(卷积神经网络)、RNN(循环神经网络)和DNN(深度神经网络)
本文转载修改自:知乎-科言君 感知机(perceptron) 神经网络技术起源于上世纪五.六十年代,当时叫感知机(perceptron),拥有输入层.输出层和一个隐含层.输入的特征向量通过隐含层变换达 ...
- new和delete必须成对出现吗?【网上集合贴+个人总结】
new和delete必须成对出现吗?[网上集合贴+个人总结] 1.从内存泄露与否的角度考虑 new 和 delete不一定要成对出現.理论上是這樣的.但是从习惯上來說,new delete成對出現是一 ...
- Windows环境下使用Node.js
作者:短工邦技术部 - 陈文哲 Parse用的就是Node.js,所以我们要先了解什么是Node.js,以及做一些简单的操作. Node.js 的主要思路是:使用非阻塞的,事件驱动的 I/O 操作来保 ...
- OpenSSL所有版本的变化,从1.1开始架构有所变化,生成的lib名称也有所不同了,以及对Qt的影响
The complete explanation is that 1.0.x and 1.1.x do not have the same naming conventions for the gen ...
- Voovan 是一个高性能异步网络框架和 HTTP(Java)
Voovan 是一个高性能异步网络框架和 HTTP 服务器框架,同时支持 HTTP 客户端抓取.动态编译支持.数据库访问封装以及 DateTime.String.Log.反射.对象工具.流操作.文件操 ...
- 可视化流程设计——流程设计器演示(基于Silverlight)
上一篇文章<通用流程设计>对鄙人写的通用流程做了一定的介绍,并奉上了相关源码.但一个好的流程设计必少不了流程设计器的支持,本文将针对<通用流程设计>中的流程的设计器做一个简单的 ...