QQ群信息爬取-------使用模拟登陆(1)
这个比之前的爬取效率更高,爬取的网站https://qun.qq.com/member.html,简单说一下思路
- 首先首先使用模拟登陆获取cookie
- 经过抓包,我发现了Q群的数据接口为https://qun.qq.com/cgi-bin/qun_mgr/search_group_members,使用requests模块向该网站发送post请求,需要post的数据格式为:{‘gc’: qqGroupNum, ‘st’: 0, ‘end’: 100, ‘sort’: 0, ‘bkn’: self.bkn},返回结果为json数据
- 拿到json数据就可以保存到文本或者数据库。
1.模拟登陆
还是使用selenium模拟登陆即可
url = "https://qun.qq.com/member.html"
driver = webdriver.Chrome()
driver.delete_all_cookies()
driver.get(url)
time.sleep(1)
driver.switch_to.frame("login_frame") # 进入登录iframe
time.sleep(1)
change = driver.find_element_by_id("switcher_plogin")
change.click()
driver.find_element_by_id('u').clear() # 选择用户名框
driver.find_element_by_id('u').send_keys(qq)
driver.find_element_by_id('p').clear()
driver.find_element_by_id('p').send_keys(passwd)
driver.find_element_by_class_name("login_button").click()
获取到一些关键的cookie值即可关闭浏览器了,关键的cookie值有skey,p_skey
下面详解抓包破解
2.抓包破解接口
打开网页https://qun.qq.com/member.html用户密码登陆和fiddler
输入正确QQ号和密码成功登录后,查看一下fiddler
为了看得更清楚这个请求,操作如下
右上角有个 Execute可以执行这个post请求,可以自己琢磨一下
经过我的测试,想通过这个请求获取到正确的数据必须需要cookie中的uin,skey,p_skey以及请求数据gc,st,end,sort,bkn。
对这些参数进行一个一个分析,如下:
- uin:这个一眼就可以看出来是,字符o拼上自己的QQ号即可
- skey和p_skey:不太清楚是啥,但可以从cookie中直接获取到,所以才需要进行模拟登陆获取cookie的步骤
- gc:QQ群的号码
- st:应该是start的意思,Q群成员的序号
- end:和st对应,Q群成员的序号,通过st和end就可以获取到从第st个到第end个成员这个意思
- sort:不用管,就给个值为0就行了
- bkn:这个数据是经过特别计算的值,应该是为了验证登录之类的,相当于小小的加密了吧,我研究了一段时间,不管从哪里都获取不到这个值,最后是在一段JavaScript代码里面,发现这个值的计算方式,嗯,我果然是天才,哈哈哈,我们回到浏览器,F12一下,查看都有哪些js,如下
把js复制到notepad++,来一探究竟吧
所以我们知道bkn值的计算是和cookie值中的skey有关的,把这些数据都拿出来,愉快的编程吧
skey = driver.get_cookie('skey')['value']
p_skey = driver.get_cookie('p_skey')['value']
cookie = "uin=o" + qq + "; skey=" + self.skey + "; p_skey=" + self.p_skey
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
"Cookie": self.cookie
}
e = skey
t = 5381
for n in range(0, len(e)):
t += (