如题所示,这个网站原本是给别人做单子,但是后面做完卖家跑单了,发出来供大家交流学习一下,网站本身没多大难度。
该文章仅供交流使用,请勿非法使用,如有侵犯,请联系删帖。
一.分析
随便选一本书进去,然后打开f12进行刷新,进行筛选包,定位xhr,doc,发现xhr没有包,doc就有,标红框的就是显示指定类型的包,可以看到有很多重复的包,点开发现是广告和其他内容。
只有第一个带有书id的没有重复的,点进去看。
我们最终是要下面的这些集数的链接,所以结合刚才上一步的那个包进行提取链接,我推荐这里直接用re(正则),当然用其他的也可以
进去通过关键词定位定到下面的图,可以发现有两个不同的提取(如下图所示),第一个前面class带着f,后面则没有class,通过页面对比,可以了解这是区分免费和收费的(这里只提取免费)
点进随便一集的链接进去,点进可以发现很多广告,然后还带着一个播放条,那么这就是音频所在的地方了(很多广告,我就不上页面了),直接抓包,然后进行筛选,点击media,可以发现很多重复的MP4
,就只有一个MP3,还是从集数的链接位置过去,那这个就是音频的链接了,复制链接重新打开网页试一试,发现可以播放。
然后对这个音频链接进行分析,可以发现有时间,一大段不知道从哪来的东西,时间戳,bookid等,已知的参数先不管,先找那未知的参数,直接把筛选定到all,ctrl+f进行搜索参数,可以发现有两个结果。
第一个已知,那就第二个进行分析,可以发现返回的就是我们的MP3链接。
我们再对这个包进行分析,这个包是post提交,不光有url,也有提交的参数,提交的参数可以通过分析发现bookid,付费的章节,现在的章节。
其中在上条post中,会发现有请求头中有一个xt参数,估计是一个验证免费或是付费的,还是按照之前的操作搜索,发现是在章节的网页里可以提取到的。
二.代码
把需要提取的参数进行例举一下:bookid,xt参数,付费章节等
代码中没有放解决报错的代码,这个下面可以自己去加上。
代码写得很简洁,有什么功能可以自己进行添加。
代码如下:
[Python] 纯文本查看 复制代码 def get_books_link(url):
import requests
import re
#通过字符串的方法提取book_id
book_id = url.split('/')[-1]
#设置ua
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:57.0) Gecko/20100101 Firefox/57.0"
}
#定义一个默认的ua
de_headers = headers.copy()
reps = requests.get(url, headers=headers)
#提取免费的章节数
pattern = re.compile(r'<a class="f" href="(.*?)">(.*?)</a>')
chapter_list = re.findall(pattern, reps.text)
#进行提取列表最后一条,然后再加一
pay_chap = str(int(chapter_list[len(chapter_list) - 1][1]) + 1)
for chapter in chapter_list:
#补全链接
chap_url = 'https://ting55.com' + chapter[0]
chap_num = chapter[1]
reps = requests.get(chap_url, headers=headers).text
#提取xt参数
xt = re.search(re.compile(r'<meta name="_c" content="(.*?)"/>'), reps).group(1)
#设置post的提交data
data = {
'bookId': book_id,
'isPay': pay_chap,
'page': chap_num
}
#更新请求头协议
headers.update({"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Referer": chap_url,
"X-Requested-With": "XMLHttpRequest",
"xt": xt})
#因为返回内容是json格式,就直接返回json
reps = requests.post('https://ting55.com/glink', data=data, headers=headers).json()
#提取MP3链接
links = reps["url"]
#访问链接
reps = requests.get(links, headers=de_headers)
#按照章节数来保存MP3文件
with open(f'{chap_num}.mp3', 'wb') as f:
f.write(reps.content)
f.close()
if __name__ == '__main__':
get_books_link('https://ting55.com/book/14917')
|