谢谢京九的分享
上一篇博客教大家下载了公众号中的音频文件,这次利用python脚本进行批量下载。
首先还是跟上一次操作差不多,先把微信设置好,然后点击链接,进入浏览器中
这次我们要爬取的就是这些文章中的音频。
首先我们要知道如何下载当前页面的音频,还是F12,然后点击network,Media,点击播放按钮,弹出下面的文件
双击文件,弹出新的页面,此时的页面链接就是该音频的真实地址,可以通过访问该网址得到音频文件。
为了了解该文件是如何传输的,我们用burpsuite抓包看看
这个就是请求报文的头部,Go
返回的响应包体中包含大量的乱码,其实这个就是音频文件本身。我们的音频文件传输都是以这种方式传输的,看看Hex形式的样子
我们把这些字符保存下来会怎么样呢?
点击Headers,在下方点击右键,选择copy to file
保存为1.mp3,这时保存的路径就出现一个名为1.mp3的文件,点击运行,果然可以播放。
其实说了这么多就是为了告诉大家,音乐文件的存储不外乎这些字符,我们只需要把得到的报文中的字符保存成文件,就相当于保存了音乐本身。
知道了这个知识,我们就可以进行下一步操作,就是利用python模拟访问网页。
1.获取歌曲的真实下载地址
这个是获得音乐真实下载地址的代码,headers中的User-Agent和Cookie是必不可少的。因为微信中的网页对用户浏览器做了严格的限制,打开微信公众号的文章时,都会首先校验是否是微信浏览器打开,如果不是,会弹出请用微信浏览器打开的网页。而为什么我们现在能通过电脑浏览器访问微信公众号的页面呢?就是因为我们从微信中点开该链接时,系统自动帮我们加上了微信浏览器的UA。
利用requests库访问目标url,从返回的内容中找到’voice_encode_fileid=”(.*?)”‘字符串,然后返回给url。
上面这个操作有两个需要注意的:
1.前面的url和后面返回的url不是一个url,前面的url是我们最开始点击的链接,也就是公众号文章的链接。而后一个链接是从公众号文章中获取到的歌曲真实下载地址链接。
2.为什么找’voice_encode_fileid=”(.*?)”‘这个字符串呢?
因为我们要获取到歌曲真实的下载地址,如何在页面中找到这个地址呢?
首先检查元素,找到歌曲的编号
我们检查网页源代码,搜索歌曲的编号
看到该歌曲的编号前面字符串就是’voice_encode_fileid=’,然后中间的(.*?)这个是python的re模块贪婪匹配的符号,我们需要将这个代替我们想要获取的字符串。最后我返回了一个url和一个名字,主要是为了下载歌曲时命名所用。
通过上面的操作我们获得了歌曲的真实下载地址,接下来就是下载歌曲
2.下载歌曲
下载歌曲的代码其实就相当简单明了,通过字符串拼接出真实下载地址,然后get,将获得的响应报文中的包体写入到文件中,文件的名字就是上一步获取到的名字。
这里主要涉及到的就是歌曲的保存问题,有了前面的知识,相信理解起来也就不是太难了。
3.获取其他歌曲的链接
上面的代码就是获取其他歌曲的链接,也是通过检查页面源代码,然后找到网页中其他歌曲的链接并保存下来。
这个函数中有一个url_queue,这个是python中的队列,主要是避免多线程操作时出现未知的内存错误。
获得了链接后,该函数会将url放入到url_queue队列中,等待get_url函数读取到其真实的歌曲下载地址。
4.主函数,模块的组合
程序首先定义一个队列,用来存放歌曲链接,然后定义了一个url_list,存放初始的公众号文章链接,通过这些链接获取到更多的链接。然后定义一个循环,对url_list中的url进行爬取,获得更多的歌曲链接。最后定义了一个循环,获取到歌曲的真实下载链接和名字,然后通过get_music()函数将歌曲保存到本地。
点击运行
可以看到程序先读取了url_list
然后保存相关的歌曲,并将歌曲命名为该编号的最后3个字符
最后获取到了39个歌曲,这个爬虫只是一个粗略的版本,并没有对很多情况进行处理,这个只能算一个爬取一轮的爬虫,并没写递归或循环进行更加深度或广度的爬取。需要爬取别的页面可以将页面的url放入到main函数的url_list中,未来有机会再研究更加深度的爬虫。
代码如下:
[hide reply_to_this=”true”]
import requests import re import queue import urllib def get_url(url_queue): url= url_queue.get() headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0', 'Accept':'text/html,application/xhtml xml,application/xml;q=0.9, image/webp,*/*;q =0.8', 'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Accept-Encoding':'gzip, deflate','Connection':'close', 'Cookie': 'pgv_pvi=9878417408; ptui_loginuin=790278795@qq.com; RK=yJpRPPY9Uj; ptcz=4962d0bafb475132feff5f2d574aff0dda6ceee273cb0983d5ecb28098b25828; pgv_pvid=6161950604','Upgrade-Insecure-Requests':'1'} sess = requests.Session() res = sess.get(url,headers=headers).content url_pattern = r'voice_encode_fileid="(.*?)"' url = re.findall(url_pattern,res,re.I|re.S) #name_pattern = r'name="(.*?)"' #name_list = re.findall(name_pattern,res,re.I|re.S) #name = name_list[-1].split('&')[0].decode('utf-8') print url[0] name = url[0][-3:] return url[0],name def get_music(url,name): music_url ='https://res.wx.qq.com/voice/getvoice?mediaid=%s'%url res = requests.get(music_url).content f_in = open('%s.mp3'%name,'wb') f_in.write(res) print "finished!" def get_html(url_queue): url='https://mp.weixin.qq.com/s?__biz=MzIzMTI1NDA4NA==&mid=2651041 555&idx=1&sn= fe2e0821fcc57052329ff17b992cba21&chksm= f351fe38c426772e01088b991e1fc540533bd9c42c3810b36ce25996a6 acfc0f77c96337a89e&scene=21#wechat_redirect' headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0', 'Accept':'text/html,application/xhtml xml,application/xml;q=0.9, image/webp,*/*;q =0.8', 'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Accept-Encoding':'gzip, deflate','Connection':'close', 'Cookie': 'pgv_pvi=9878417408; ptui_loginuin=790278795@qq.com; RK=yJpRPPY9Uj; ptcz=4962d0bafb475132feff5f2d574aff0dda6ceee273cb0983d5ecb28098b25828; pgv_pvid=6161950604','Upgrade-Insecure-Requests':'1'} sess = requests.Session() res = sess.get(url,headers=headers).content html_pattern =r'' url_list = re.findall(html_pattern,res,re.I|re.S) for i in range(len(url_list)): url_queue.put('http://%s'%url_list[i]) print 'url_list crawlled successfully!' def get_new_html(url,url_queue): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0', 'Accept':'text/html,application/xhtml xml,application/xml;q=0.9, image/webp,*/*;q =0.8', 'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Accept-Encoding':'gzip, deflate','Connection':'close', 'Cookie': 'pgv_pvi=9878417408; ptui_loginuin=790278795@qq.com; RK=yJpRPPY9Uj; ptcz=4962d0bafb475132feff5f2d574aff0dda6ceee273cb0983d5ecb28098b25828; pgv_pvid=6161950604','Upgrade-Insecure-Requests':'1'} sess = requests.Session() res = sess.get(url,headers=headers).content html_pattern =r'' url_list = re.findall(html_pattern,res,re.I|re.S) for i in range(len(url_list)): url_queue.put('http://%s'%url_list[i]) #get_new_html('http://%s'%url_list[i],url_queue) print 'url_list crawlled successfully!' if __name__=='__main__': url_queue = queue.Queue(maxsize=10000) get_html(url_queue) url_list = ['https://mp.weixin.qq.com/s?__biz=MzIzMTI1NDA4NA==&mid=2651037839&idx=2&sn= d93feea815aba5806f4c110e75df65c6&chksm= f351f1a4c42678b24d80e331df6d78d42f2521b40e7708f25a405efa1d0ae9d61bf8a6e98a77& scene=21#wechat_redirect','https://mp.weixin.qq.com/s?__biz=MzIzMTI1NDA4NA== &mid=2651037580&idx=1&sn=43040fde8b304a0983f1b68d9512ecf6&chksm= f351cea7c42647b11cb1f04c6d59c462c17f335c353b1683a7a8bcee36def595356d938c1c17& scene=21#wechat_redirect','https://mp.weixin.qq.com/s?__biz=MzIzMTI1NDA4NA== &mid=2651037446&idx=3&sn=6b001574c4f0c6d354b5b5fffc4a922f&chksm= f351ce2dc426473bfd9a2363e811b2f45b202570d9b74f5222ff0efffcb304fc0926e7b57995& scene=21#wechat_redirect','https://mp.weixin.qq.com/s?__biz=MzIzMTI1NDA4NA== &mid=2651037355&idx=5&sn=994655622213645785b23776fa46d173&chksm= f351cf80c426469690fcdf7bff206026c0733b19eb4ab28f0f3a7ebea1462a9abb59e11c4d18& scene=21#wechat_redirect'] #url = url_queue.get() for i in range(4): get_new_html(url_list[i],url_queue) while(not url_queue.empty()): url,name = get_url(url_queue) #print url,name get_music(url,name)
下载代码点这里。
[bdbtn]http://image.chenjingjiu.cn/wx-download1.py[/bdbtn][/hide]
Comments | NOTHING