#文章首发于公众号“如风起”。
原文链接:Python随笔|抓取QQ群成员头像mp.weixin.qq.com
最近需要用到QQ群成员的头像,但是,一个一个点开大家的头像再保存太麻烦了,所以就写了一段代码抓取一下。
和大家分享一下这一段爬虫代码。Python版本:Python 3.8.0
操作平台:PyCharm
使用的库:requests、json、os
爬虫目标:抓取QQ群成员的头像,并以QQ昵称命名文件名
腾讯有一个专门的管理QQ群的网页:QQ群官网-成员管理qun.qq.com
我们可以通过这个网页抓取需要的QQ群的信息。
首先,我们登陆管理QQ群的官网,选择一个群进入。
打开开发者工具,进入"Network",看下数据具体的位置,通过查找发现数据信息位于search_group_members下,数据在json里面,每一条即是一个成员的信息。
点开查看一下具体的内容。
通过比对,不难发现,其中,"card"表示QQ群备注;"nick"表示QQ昵称;"uin"表示QQ号。
点击"Headers",我们看一下头部信息。
请求是post,我们查看一下表单数据。
其中,"gc"表示QQ群号,"st"表示开始成员,"end"表示结束成员,"bkn"是QQ群的加密参数,有点复杂,我们直接复制使用。
下面我们开始编写抓取数据的代码。
通过上面的分析,可以看到,表单信息显示每次返回20条数据,为了爬取QQ群所以成员,我们需要定义一下data的函数。
def get_data(num):
data = {
'gc': '123456',#QQ群号
'st': num*21,
'end': num*21 + 20,
'sort': '0',
'bkn': '12345678'#直接从From Data复制过来
}
return data
然后,我们构造抓取QQ群成员信息的函数,利用"requests.post"进行抓取,并json库将json转化为list。
def get_con(url,data):
requests.packages.urllib3.disable_warnings()
response = response = requests.post(url, headers=headers, data=data)
response.encoding = response.apparent_encoding
text = json.loads(response.text)
content = text['mems']
for item in content:
xinxi = {
'qqmem': item['uin'], #QQ群成员QQ号
'beizhu': item['card'], #QQ群成员备注
'name': item['nick'] #QQ群成员昵称
}
yield xinxi
然后,我们抓取QQ群成员的头像,并用昵称命名文件。
QQ头像的图片地址为:
其中"123456"表示成员的QQ号码,通过更好QQ号码,拼接新的连接,我们即可获取成员头像。
def get_pic(url):
for i in range(100):
try:
content = get_con(url=url, data = get_data(i))
if not os.path.isdir('picture'):
os.mkdir('picture')
for item in content:
pic_url = 'https://q4.qlogo.cn/g?b=qq&nk={}&s=140'.format(item['qqmem'])
print(pic_url, item['name'])
abs_path = os.path.join('picture', '%s.jpg' %item['name'])
open(abs_path, 'wb').write(requests.get(pic_url, verify=False).content)
except:
pass
复制浏览器的Headers,运行程序。
if __name__ == '__main__':
url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'
get_pic(url)
爬取效果如下。