前言
关于写这篇文章我做了很多工作,想了很多办法,尝试过QQ邮箱、QQ空间、QQ查找抓包,最终也没有选出一个好方法,不能爬下完全的数据,但能尽可能的爬下多的数据 包括昵称、网名、分组、年龄、地址
看一下效果
提示:以下是本篇文章正文内容,下面案例可供参考
一、方法的选择
首先我们先看一下如果通过QQ邮箱能获取什么数据,如果说是通过QQ邮箱爬QQ好友信息,那只能拿到昵称和QQ邮箱号 所以不选择这中方法
再来看看通过QQ空间能拿到哪些数据,我们在QQ空间发动态那里点击部分好友可见,目的是将好友数据全部加载出来,观察抓包后的结果 可以看到其中有分组、昵称、网名、qq号、头像链接
我们在来看看QQ查找能抓到什么数据,我们进入find.qq.com,在其中输入qq查找,抓包 看能抓到什么数据,我们可以看到有QQ号,年龄、国家、性别、省份、头像链接
最终我选择的方法是通过QQ空间和QQ查找两种方法相结合的方式,尽可能的获取多的数据
二、通过QQ空间获取好友信息
现在我们通过QQ空间获取好友信息,因为只有通过QQ空间获得了好友的QQ号,我们才能通过QQ查找获取更多的数据
在上面我们已经找到了QQ空间好友信息数据包,并且所有的QQ好友信息都在一个数据包中,现在我们可以直接写代码
head={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
'cookie':'tvfe_boss_uuid=3eec8ab61924dc8d; pgv_pvid=5532717881; RK=CnIgT93OeT; v8=44'
}
text=requests.get(url=url,headers=head).text
text=text.replace("_Callback","").replace("(","").replace(")","")
text="".join([text.strip().rsplit("}", 1)[0], "}"])
data=json.loads(text)
for da in data["data"]["items"]:
dic={}
try:
dic["qq"]=da["uin"] #QQ号码
except:
dic["qq"]=""
try:
dic["groupid"]=da["groupid"] #QQ分组
except:
dic["groupid"]=""
try:
dic["name"]=da["name"] #QQ网名
except:
dic["name"]=""
try:
dic["remark"]=da["remark"] #QQ备注
except:
dic["remark"]=""
try:
dic["img"]=da["img"] #QQ头像链接
except:
dic["img"]=""
try:
dic["yellow"]=da["yellow"] #黄钻等级
except:
dic["yellow"]=""
with open(".//QQ_KJ.csv", "a+", encoding="utf-8") as f:
writer = csv.DictWriter(f, dic.keys())
writer.writerow(dic)
三、通过QQ查找获取好友信息
通过上面的操作我们已经拿到了六列QQ好友信息,现在我们来通过QQ查找获取其他信息
我们在最上面已经抓包获取了数据包,现在我们来分析一下他的url和所带的有用参数,url是不变的,在边的一直是参数准确的说变得就是keyword 就是好友QQ号
url:https://find.qq.com/proxy/domain/cgi.find.qq.com/qqfind/buddy/search_v3
参数:
keyword= QQ好友QQ号
ldw= 你自己的参数
通过上面的url和参数,利用requests访问就可以获取QQ好友的部分数据,现在我们来代码实现
#读取数据
names=["qq","groupid","name","remark","img","yellow"]
df=pd.read_csv("QQ_KJ.csv",names=names)
print('-' * 30 + "开始获取QQ查找数据" + '-' * 30)
#通过qq号生成参数
params_list=[]
for qq in df.qq:
params={
'keyword':qq,
'ldw':你的参数
}
params_list.append(params)
print('-'*30+"共生成%d个参数"%(len(params_list))+'-'*30)
head = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
'cookie': 'tvfe78CA4C2DAE58860A362928729B50; uid=1015261235; skey=@6bAznJAMu'
}
url="https://find.qq.com/proxy/domain/cgi.find.qq.com/qqfind/buddy/search_v3"
#遍历参数列表访问页面解析数据
print('-' * 30 + "开始访问页面获取数据"+ '-' * 30)
for params in params_list:
#因为有的QQ好友设置了限制 限制QQ查找找到自己 所有try
try:
text=requests.get(url=url,headers=head,params=params).json()
data=text["result"]["buddy"]["info_list"][0]
with open(".//QQ_find.csv", "a+", encoding="utf-8") as f:
writer = csv.DictWriter(f, data.keys())
writer.writerow(data)
except:
pass
最后我们将两个文件的数据处理一下
def Save_data(self):
names = ["qq", "groupid", "name", "remark", "img", "yellow"]
df1 = pd.read_csv("QQ_KJ.csv", names=names)
names = ["qq", "name", "country", "provinc", "city", "gender","age","url"]
df2 = pd.read_csv("QQ_find.csv", names=names).drop(["url","qq"],axis=1)
df=pd.merge(df1,df2,on="name",how="left") #根据name列左连接两个表
df=df.drop_duplicates("remark").reset_index(drop=True) #根据备注列去重
os.remove("QQ_find.csv") #删除表
os.remove("QQ_KJ.csv") #删除表
df.to_csv("QQ_find.csv",encoding="utf_8_sig")
个人主页已经更新多个爬虫案例,有兴趣可以去看看,所有源码在公众号“阿虚学Python”中都可以获得,这次案例回复“QQ好友”获取