〇、前情提要
给爷爬。
参考:
- heartbreaker97/spider_qzone_friends
https://github.com/heartbreaker97/spider_qzone_friends - python爬虫-登录QQ空间获取COOKIES
https://www.bilibili.com/video/BV1w7411W7YR - python爬虫-QQ好友列表获取
https://www.bilibili.com/video/BV157411W7cx - python爬虫-说说点赞和评论列表获取
https://www.bilibili.com/video/BV1L7411W7ce
一、README.md
qq空间爬虫生成好友关系网
使用方法:
- 将cookie.py的chromedriver的地址修改成自己的(设置了环境变量的可不设置),账号密码按照提示修改后运行,生成cookie
- 运行spider.py爬取数据并初步分析将结果生成txt文件保存至本地
- 运行show_relation下的analysis.py,得到好友关系值文件
- 将show_relation中的relation.php按照其中提示修改第三步得到的txt文件的路径,再将整文件夹放置本地搭建的web服务器下,并在http://echarts.baidu.com/download.html 下载echarts插件,放在该文件夹下在浏览器上打开relation.php
效果图,为了显示效果和隐私问题,把名字给去了
局部效果
爬虫太慢,代码还在持续修改重构中,针对没有搭建本地web服务器的显示结果
二、登录QQ空间获取COOKIES-cookie.py
from selenium import webdriver
from time import sleep
import json
怎么使用selenium,及其驱动和浏览器匹配情况。
driver = webdriver.Chrome()
自动打开Chrome浏览器
driver.get('https://user.qzone.qq.com/你的qq/main')
自动登录你的qq主页
driver.switch_to.frame('login_frame')
找到登录的iframe
driver.switch_to.frame('login_frame')
safari审查元素,账号密码登录为< a >,其id为switcher_plogin
driver.find_element_by_id('switcher_plogin').click()
找到该元素点击,模拟用户浏览器行为
跳转到账号密码登录后,两个< input >的id分别为u和p
driver.find_element_by_id('u').send_keys('你的qq') driver.find_element_by_id('p').send_keys('你的密码')
driver.find_element_by_id('login_button').click()
模拟用户按了登录按钮,此时登录的cookies被保存。
cookies = driver.get_cookies()
cookie_dic = {
}
for cookie in cookies:
if 'name' in cookie and 'value' in cookie:
cookie_dic[cookie['name']] = cookie['value']
with open('cookie_dict.txt', 'w') as f:
json.dump(cookie_dic, f)
最后得到的cookie_dict文件如下所示:
例如ptui_loginuin为qq号…
from selenium import webdriver
from time import sleep
import json
#chromedriver = 'C:/Users/13180/AppData/Local/Google/Chrome/Application/chromedriver.exe'
#driver = webdriver.Chrome(chromedriver)
driver = webdriver.Chrome()
driver.get('https://user.qzone.qq.com/你的qq/main')
driver.switch_to.frame('login_frame')
#找到账号密码登陆的地方
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').send_keys('你的qq')
driver.find_element_by_id('p').send_keys('你的密码')
driver.find_element_by_id('login_button').click()
#保存本地的cookie
sleep(1)
cookies = driver.get_cookies()
cookie_dic = {
}
for cookie in cookies:
if 'name' in cookie and 'value' in cookie:
cookie_dic[cookie['name']] = cookie['value']
with open('cookie_dict.txt', 'w') as f:
json.dump(cookie_dic, f)
三、QQ好友列表获取
进入空间后,点击说说,点击@,在Network里会弹出一个新的response(来自qq服务器)
双击该response,进入preview,data会返回很多信息,uin为qq号,name为qq昵称,remark为注释
通过程序来获取这样一个网址,然后可以得到一个相应
相应有如下参数:g_tk为最关键的参数
以下方法提供如何求gtk的值,求出后网址便构造完毕
#算出来gtk
def get_gtk(self):
p_skey = cookie['p_skey']
h = 5381
for i in p_skey:
h += (h << 5) + ord(i)
g_tk = h & 2147483647
return g_tk
就可以找出好友列表,通过所有好友列表,进行一个请求,把你需要的信息存入字典,即可获得你想要的信息。
#找出好友列表
def get_friend(self):
url_friend = 'https://user.qzone.qq.com/pro