python3.7 爬取QQ空间好友

使用selenium库自动登录,记录登录的Cookie。以下URL分别代表不同的动作,虽然没有全用。

留言:https://user.qzone.qq.com/proxy/domain/m.qzone.qq.com/cgi-bin/new/get_msgb?uin=1612893772&hostUin=1148639090&start=0&s=0.8883444517176473&format=jsonp&num=10&inCharset=utf-8&outCharset=utf-8&g_tk=2208268&qzonetoken=bede67d5ca4dc0944791e45f795beeb346e50a23b20df9b4152a142232a7f7cd40e26b929798e3b74bab&g_tk=2208268
好友:https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=1612893772&do=1&rd=0.19169828437926406&fupdate=1&clean=1&g_tk=108064521&qzonetoken=77bdd3f44636c7b403a6462f493a2e6e02e6b8cd1772fe928bf511442e491315df84454ad4455093f2&g_tk=108064521

说说:https://h5.qzone.qq.com/proxy/domain/ic2.qzone.qq.com/cgi-bin/feeds/feeds_html_module?i_uin=1148639090&i_login_uin=1612893772&mode=4&previewV8=1&style=25&version=8&needDelOpr=true&transparence=true&hideExtend=false&showcount=5&MORE_FEEDS_CGI=http://ic2.qzone.qq.com/cgi-bin/feeds/feeds_html_act_all&refer=2&paramstring=os-winxp|100

兴趣爱好:https://h5.qzone.qq.com/proxy/domain/page.qq.com/cgi-bin/profile/interest_get?uin=851676467&vuin=1612893772&flag=1&rd=0.7835457101159748&fupdate=1&g_tk=896484925&qzonetoken=38bcb8fb59e772a31ff4ca2358781258d1c7f4e2c8f640e537d6bf52ccc4ab48c7614fa3a57a5cabf0

以下是具体代码:
  1 from urllib import parse
  2 from selenium import webdriver
  3 import requests
  4 import json
  5 from json import loads
  6 import time
  7 import pymssql
  8 import datetime
  9
 10 def get_key_values(body,key,end =‘;‘):
 11     """提取body中不包括的key,分片操作
 12
 13     :param body: 父字符串
 14     :param key: 子字符串
 15     :param end: 结束字符串,默认为;
 16     :return: 不包括子字符串的字符串
 17     """
 18     return body[body.find(key) + len(key): body.find(‘;‘, body.find(key))]
 19
 20 def get_key(cookies):
 21     """获取cookie中的相关键的值
 22     解密
 23
 24     :param cookies: 缓存
 25     :return: 相关键的值
 26     """
 27     key = get_key_values(cookies,‘p_skey=‘)
 28     h = 5381
 29     for i in key:
 30         h += (h << 5) + ord(i)
 31     return h & 2147483647
 32
 33 def web_login_cookie():
 34     """url = ‘https://user.qzone.qq.com/QQ号相关的缓存
 35     实现自动化登录
 36
 37     :return: 浏览器的缓存
 38     """
 39     driver = webdriver.Chrome()
 40     qq_account = ‘1612893772‘
 41     qq_password = ‘13974162858x‘
 42     login(driver,qq_account,qq_password)
 43     time.sleep(10)
 44     driver.get(‘https://user.qzone.qq.com/{}‘.format(qq_account))
 45     cookie = ‘‘
 46     for elem in driver.get_cookies(): # 记录登录的Cookie
 47         # elem 为 dict类型
 48         cookie += elem["name"] + "=" + elem["value"] + ";"
 49     # cookies = cookie
 50     return cookie
 51
 52 def login(driver,qq_account,qq_password):
 53     """登录
 54
 55     :param driver: 浏览器对象
 56     :param qq_account: QQ账号
 57     :param qq_password: QQ密码
 58     :return:
 59     """
 60     driver.maximize_window()
 61     driver.get(‘http://user.qzone.qq.com‘)
 62     driver.switch_to.frame(‘login_frame‘)
 63     time.sleep(1)
 64     driver.find_element_by_id("switcher_plogin").click()
 65     driver.find_element_by_id("u").send_keys(qq_account)
 66     time.sleep(2)
 67     driver.find_element_by_id("p").send_keys(qq_password)
 68     time.sleep(2)
 69     driver.find_element_by_id("login_button").click()
 70
 71 def send_requests(req,headers,url,params=None):
 72     """url_friend = ‘https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?‘
 73     url_friend携带以下参数:uin(QQ号)、do(没有它,返回空,默认值为:1)
 74     rd,g_t,qzonetoken(每次登录都发生变化,从Cookiezz中获取)
 75     fupdate,clean(默认值为:1)
 76
 77     :param req: 请求(Request),该请求为会话
 78     :param headers: 请求头
 79     :param params: 请求参数
 80     :return: JSONP数据
 81     """
 82     if None != params:
 83         url = url + parse.urlencode(params)
 84     # url = url+‘&offset=‘+str(0)
 85     page = req.get(url=url, headers=headers)
 86     return page.text
 87
 88 def get_each_str(req,uin,headers):
 89     each_url = ‘https://user.qzone.qq.com/{}‘.format(uin)
 90     page = req.get(url=each_url, headers=headers)
 91
 92 def friend_db(dicts,name=‘‘):
 93     """操作DB
 94
 95     :param dicts: 数据字典信息
 96     :param name: 备注名
 97     :return: void
 98     """
 99     if len(str(dicts[‘birthyear‘])) < 4:
100         dicts[‘birthyear‘] = ‘1900‘
101     if dicts[‘birthday‘][1:2] == ‘0‘:
102         dicts[‘birthday‘] = ‘01-01‘
103     if len(dicts[‘signature‘]) > 70:
104         dicts[‘signature‘] = ‘‘
105     friend_db_dict = {
106         ‘friendInfo‘: [
107         dicts[‘uin‘], name, dicts[‘age‘], ‘男‘ if dicts[‘sex‘] == 1 else ‘女‘
108         , datetime.datetime.strptime(str(dicts[‘birthyear‘]) + ‘-‘ + str(dicts[‘birthday‘]), ‘%Y-%m-%d‘)],
109         ‘friendPlace‘: [
110         dicts[‘uin‘], dicts[‘company‘],dicts[‘career‘], dicts[‘hco‘] + dicts[‘hp‘] + dicts[‘hc‘],
111         dicts[‘country‘] + dicts[‘province‘] + dicts[‘city‘],dicts[‘cco‘] + dicts[‘cp‘] + dicts[‘cc‘], dicts[‘cb‘]],
112         ‘friendNet‘: [
113         dicts[‘uin‘], dicts[‘nickname‘], dicts[‘spacename‘], dicts[‘desc‘], dicts[‘signature‘]]
114     }
115     conn = pymssql.connect(host=‘localhost‘, user=‘sa‘, password=‘123456‘, database=‘friendDB‘,
116                             charset=‘utf8‘)
117     cur = conn.cursor()
118     sql = "begin tran insertData insert into friendInfo values({},‘{}‘,{},‘{}‘,‘{}‘);" 119           "insert into friendPlace values({},‘{}‘,‘{}‘,‘{}‘,‘{}‘,‘{}‘,‘{}‘);" 120           "insert into friendNet values({},‘{}‘,‘{}‘,‘{}‘,‘{}‘);" 121           "commit tran insertData".122         format(friend_db_dict[‘friendInfo‘][0],friend_db_dict[‘friendInfo‘][1],friend_db_dict[‘friendInfo‘][2]
123                 ,friend_db_dict[‘friendInfo‘][3],friend_db_dict[‘friendInfo‘][4],friend_db_dict[‘friendPlace‘][0],
124                 friend_db_dict[‘friendPlace‘][1],friend_db_dict[‘friendPlace‘][2],friend_db_dict[‘friendPlace‘][3],
125                 friend_db_dict[‘friendPlace‘][4],friend_db_dict[‘friendPlace‘][5],friend_db_dict[‘friendPlace‘][6],
126                 friend_db_dict[‘friendNet‘][0],friend_db_dict[‘friendNet‘][1],friend_db_dict[‘friendNet‘][2],
127                 friend_db_dict[‘friendNet‘][3],friend_db_dict[‘friendNet‘][4])
128     print(‘sql: ‘,sql)
129     cur.execute(sql)
130     conn.commit()
131     cur.close()
132     conn.close()
133
134 def main():
135     """主要操作
136
137     :return: void
138     """
139     req = requests.session()
140     headers={‘host‘: ‘h5.qzone.qq.com‘,
141              ‘accept-encoding‘:‘gzip, deflate, br‘,
142              ‘accept-language‘:‘zh-CN,zh;q=0.8‘,
143              ‘accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,
144              ‘user-agent‘:‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/‘
145                           ‘59.0.3071.115 Safari/537.36‘,
146              ‘connection‘: ‘keep-alive‘}
147     cookie = web_login_cookie()
148     print(‘cookie‘,cookie)
149     g_tk = get_key(cookie)
150     qzonetoken_friend = get_key_values(cookie,‘ptcz=‘)
151     uin_friend = get_key_values(cookie,‘ptui_loginuin=‘)
152     rd_friend = get_key_values(cookie,‘_qpsvr_localtk=‘)
153     print(‘friend_data‘,‘qzontoken:%s;uin:%s;rd:%s‘ %(qzonetoken_friend,uin_friend,rd_friend))
154     headers[‘Cookie‘]=cookie
155     params_friend = {"uin": uin_friend,"fupdate": 1,"action": 1,"do":1,"g_tk":g_tk,"rd":rd_friend,
156                      ‘qzonetoken‘:qzonetoken_friend}
157     url_friend = ‘https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?‘
158     data_friend_str = send_requests(req,headers,url_friend,params=params_friend)
159     data_friend_dict = loads(data_friend_str[0+len(‘_Callback(‘):data_friend_str.find(‘);‘)])
160     print(‘data_friend_dict: ‘,data_friend_dict)
161     if data_friend_dict[‘code‘] != 0: # code = -3000 message = ‘请先登录‘
162         time.sleep(10)
163         main()
164     else:
165         data_friend_list = list(data_friend_dict[‘data‘][‘items_list‘])
166         for i in range(len(data_friend_list)):
167             each_uin = data_friend_list[i][‘uin‘]
168             each_url = ‘https://h5.qzone.qq.com/proxy/domain/base.qzone.qq.com/cgi-bin/user/cgi_userinfo_get_all?‘
169             params_each = {"uin": each_uin, "fupdate": 1, "vuin": uin_friend, "g_tk": g_tk, "rd": rd_friend,
170                            ‘qzonetoken‘: qzonetoken_friend}
171             time.sleep(1)
172             data_each_str = send_requests(req,headers,each_url,params_each)
173             try:
174                 data_each_dict = loads(data_each_str[0+len("_Callback("):data_each_str.find(");")])
175             except json.decoder.JSONDecodeError as e:
176                 with open(‘leak.txt‘,‘a‘,encoding=‘utf8‘) as file: # 数据持久化,统计错误信息
177                     file.write(‘except: ‘ + str(each_uin) + " " + data_friend_list[i][‘name‘] + " " + e.msg + "\n")
178                     continue
179             print(‘data_each_dict: ‘,data_each_dict)
180             if data_each_dict[‘code‘] == 0: # code = -4009 message = ‘没有访问权限‘
181                 friend_db(data_each_dict[‘data‘],name=data_friend_list[i][‘name‘])
182             else:
183                 with open(‘leak.txt‘,‘a‘,encoding=‘utf8‘) as file: # 数据持久化,统计错误信息
184                     file.write((‘没有访问权限: ‘ + str(each_uin) + " " + data_friend_list[i][‘name‘] + "\n"))
185 main()

原文地址:https://www.cnblogs.com/YuWeiXiF/p/8379803.html

时间: 2024-08-30 06:09:14

python3.7 爬取QQ空间好友的相关文章

Python爬取QQ空间好友说说并生成词云(超详细)

前言 先看效果图:  思路 1.确认访问的URL 2.模拟登录你的QQ号 3.判断好友空间是否加了权限,切换到说说的frame,爬取当前页面数据,下拉滚动条,翻页继续获取 爬取的内容写入本地TXT文件中 4.爬取到最后一页,读取TXT文件从而生成词云 具体分析 1.确认访问的URL 这就很简单了,我们通过观察发现,QQ空间好友的URL: https://user.qzone.qq.com/{好友QQ号}/311 2.我们在请求的时候会遇到模拟登录,也就是要通过Selenium+浏览器登录你的QQ

python selenium爬取QQ空间方法

from selenium import webdriver import time # 打开浏览器 dr = webdriver.Chrome() # 打开某个网址 dr.get('https://user.qzone.qq.com/2330331400/main') # 切换框架 dr.switch_to_frame('login_frame') time.sleep(1) dr.find_element_by_link_text('帐号密码登录').click() # 输入账号 dr.fi

python爬虫爬取QQ说说并且生成词云图,回忆满满!

Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句. Python支持命令式程序设计.面向对象程序设计.函数式编程.面向切面编程.泛型编程多种编程范式.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收

python3 爬取qq音乐作者所有单曲 并且下载歌曲

1 import requests 2 import re 3 import json 4 import os 5 6 7 8 # 便于存放作者的姓名 9 zuozhe = [] 10 11 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'} 12 13 14 def ge

通过Scrapy抓取QQ空间

毕业设计题目就是用Scrapy抓取QQ空间的数据,最近毕业设计弄完了,来总结以下: 首先是模拟登录的问题: 由于Tencent对模拟登录比较讨厌,各个防备,而本人能力有限,所以做的最简单的,手动登录后,获得Cookie信息,然后携带访问. 其次是数据接口: 通过对QQ空间的网页分析,数据主要是通过Json的形式返回.选择了两个数据接口进行数据抓取 每个QQ的详细信息接口: "http://user.qzone.qq.com/p/base.s8/cgi-bin/user/cgi_userinfo_

Python3从零开始爬取今日头条的新闻【一、开发环境搭建】

Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Python3从零开始爬取今日头条的新闻[四.模拟点击切换tab标签获取内容] Python3从零开始爬取今日头条的新闻[五.解析头条视频真实播放地址并自动下载] 所谓爬虫,就是通过编程的方式自动从网络上获取自己所需的资源,比如文章.图片.音乐.视频等多媒体资源.通过一定的方式获取到html的内容,再通过

python3爬取qq音乐并下载

本文参考Python 爬取qqmusic音乐url并批量下载 同学找我爬取一下qq音乐播放链接,包括歌词等信息打包成json,试了一下可以爬取. 一.找到qq音乐播放的url 1.找到搜索页面返回的数据包 歌曲最终的播放链接时经过多次拼接的,首先找到qq音乐搜索歌曲界面,https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%

Python3批量爬取网页图片

所谓爬取其实就是获取链接的内容保存到本地.所以爬之前需要先知道要爬的链接是什么. 要爬取的页面是这个:http://findicons.com/pack/2787/beautiful_flat_icons 里面有很多不错的图标,目标就是把这些文件图片爬下来,保存成本地图片. 用python3怎么做呢? 第一步:获取要爬取的母网页的内容 import urllib.request import re url = "http://findicons.com/pack/2787/beautiful_f

python3 爬虫---爬取糗事百科

这次爬取的网站是糗事百科,网址是:http://www.qiushibaike.com/hot/page/1 分析网址,参数'page/'后面的数字'1'指的是页数,第二页就是'/page/2',以此类推... 一.分析网页 网页图片 然后明确要爬取的元素:作者名.内容.好笑数.以及评论数量 每一个段子的信息存放在'div id="content-left"'下的div中 爬取元素的所在位置 二.爬取部分 工具: Python3 requests xpath 1.获取每一个段子 1 #