现在网络环境中,爬虫技术大大方便了数据的搜集。特别是那些能本地扫码登录并获取会话的爬虫,实用性非常强。这次,我们就来尝试将QQ音乐扫码登录功能转移到本地操作。
import sys
import os
import subprocess
'''用于在不同OS显示验证码'''
def showImage(img_path):
try:
if sys.platform.find('darwin') >= 0: subprocess.call(['open', img_path])
elif sys.platform.find('linux') >= 0: subprocess.call(['xdg-open', img_path])
else: os.startfile(img_path)
except:
from PIL import Image
img = Image.open(img_path)
img.show()
img.close()
'''验证码验证完毕后关闭验证码并移除'''
def removeImage(img_path):
if sys.platform.find('darwin') >= 0:
os.system("osascript -e 'quit app \"Preview\"'")
os.remove(img_path)
'''保存验证码图像'''
def saveImage(img, img_path):
if os.path.isfile(img_path):
os.remove(img_path)
fp = open(img_path, 'wb')
fp.write(img)
fp.close()
目标设定
我们的主要任务是确保QQ音乐支持本地扫码登录。具体操作是将登录二维码保存在本地并展示给用户。一旦用户成功扫码登录,系统将自动删除该二维码,并保存登录数据。这样的设计便于后续爬虫对QQ音乐数据的采集与处理。
准备工作
我们需要访问QQ音乐官网,然后点击F12键激活开发者模式。在此模式下,点击登录按钮,会出现登录界面。这一环节至关重要,它为接下来的操作奠定了基础。借助开发者模式,我们可以深入了解网页背后的数据交互过程。
self.cur_path = os.getcwd()
params = {
'appid': '716027609',
'e': '2',
'l': 'M',
's': '3',
'd': '72',
'v': '4',
't': str(random.random()),
'daid': '383',
'pt_3rd_aid': '100497308',
}
response = self.session.get(self.ptqrshow_url, params=params)
saveImage(response.content, os.path.join(self.cur_path, 'qrcode.jpg'))
showImage(os.path.join(self.cur_path, 'qrcode.jpg'))
获取二维码信息
获取图片信息非常重要。在开发者工具里,点击Img选项并向下滚动,就能看到二维码的网页链接。点击Headers,可以看到获取图片所需的链接,并研究二维码网站所需的参数。我们发现只有t参数在变动。为了验证这个参数,我们使用了postman工具,创建了一个新的请求查询,填入url和params,成功获取了二维码。因此,我们暂时认为t参数不是加密参数,可以将其视为0到1之间的随机数进行输入。
监控数据包状态
为了减少抓取的数据包数量,我们先将之前捕获的包删除,然后返回到全部界面。在点击登录进行页面跳转时,必须注意数据包的当前状态。因为登录后会有302跳转,若不及时停止抓包,后续的数据包就会被清空。经过多次访问网页,我们观察到ptqrtoken、action、login_sig这几个参数是可以变化的。
查找加密参数位置
我们根据字符串的长度和以16开头的特性,推测action变量中的第三位可能是时间戳的整数倍。于是,我们随机访问了一个时间戳网页,将action变量输入其中,结果发现其数值扩大了一千倍。然后,我们打开了开发者工具,打算寻找加密参数所在的位置。在Initiator标签页中,我们找到了各个参数的来源,并直接点击了第一个loadScript。为了进一步分析,我们又打开了一个在线代码格式化工具,将代码格式化后,在线查询了加密参数的加密方法。最终,我们得知这两个加密参数都与cookie的加密机制相关。
params.ptqrtoken=$.str.hash33($.cookie.get("qrsig"))
pt.ptui.login_sig=pt.ptui.login_sig||$.cookie.get("pt_login_sig");
获取并处理加密参数
找到了加密信息所在,便着手寻找cookie。这两个参数的潜在位置有限,无需逐一检查每个返回结果。刷新页面后,发现弹出登录框的返回信息,这是一次GET请求,URL与之前查询的一致。为确保安全,我们反复刷新,确认没有其他加密参数,庆幸它们都是常规固定参数,可以直接访问。操作完成后,我们成功找到了pt_login_sig参数,使用字典工具获取并保存了这个参数。第一个参数在登录框内已定位,据此推断第二个参数qrsig可能隐藏在二维码中。果不其然,我们轻松地从二维码信息中,通过字典的get方法提取出了所需的值。然而,获取到的加密参数不能直接使用,还需获取其hash33加密后的内容。点击Search后搜索hash33,只出现一条信息,点击进入查看相关代码。
在尝试实现这种基于本地扫码的登录爬虫过程中,大家是否遇到过特别难以解决的参数处理难题?若觉得这篇文章对您有所帮助,请记得点赞并转发!