一、模拟登陆

import re
from selenium import webdriver
from time import sleep
from PIL import Image#定义QQ空间登录函数
def QR_login():def getGTK(cookie):""" 根据cookie得到GTK """hashes = 5381for letter in cookie['p_skey']:hashes += (hashes << 5) + ord(letter)return hashes & 0x7fffffffbrowser=webdriver.PhantomJS(executable_path="D:\python\phantomjs.exe")#这里要输入你的phantomjs所在的路径url="https://qzone.qq.com/"#QQ登录网址browser.get(url)browser.maximize_window()#全屏sleep(3)#等三秒browser.get_screenshot_as_file('QZone.png')#截屏并保存图片im = Image.open('QZone.png')#打开图片im.show()#用手机扫二维码登录qq空间sleep(10)#等二十秒,可根据自己的网速和性能修改print(browser.title)#打印网页标题cookie = {}#初始化cookie字典for elem in browser.get_cookies():#取cookiescookie[elem['name']] = elem['value']print('Get the cookie of QQlogin successfully!(共%d个键值对)' % (len(cookie)))html = browser.page_source#保存网页源码print(html)g_qzonetoken=re.search(r'window\.g_qzonetoken = \(function\(\)\{ try\{return (.*?);\} catch\(e\)',html)#从网页源码中提取g_qzonetokengtk=getGTK(cookie)#通过getGTK函数计算gtkbrowser.quit()return (cookie,gtk,g_qzonetoken.group(1))
if __name__=="__main__":QR_login()

二、评论获取

import requests
import re
import datetime
from time import sleep
from urllib import parsedef comment(my_qq, target_qq, topicid, content, gtk, qzonetoken, cookie):data = {'qzreferrer': 'https://qzs.qq.com/qzone/app/mood_v6/html/index.html#mood&uin=790178228&pfid=2&qz_ver=8&appcanvas=0&qz_style=35¶ms=&entertime=1498019616488&canvastype=&cdn_use_https=1','uin': my_qq,'hostUin': target_qq,'topicId': topicid,'commentUin': my_qq,'content': content,'richval': '','richtype': '','inCharset': '','outCharset': '','ref': '','private': '0','with_fwd': '0','to_tweet': '0','hostuin': my_qq,'code_version': '1','format': 'fs'}comment_data = parse.urlencode(data)content_length = str(data)comment_params = {'g_tk': gtk,'qzonetoken': qzonetoken}comment_headers = {'Host': 'h5.qzone.qq.com','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3','Accept-Encoding': 'gzip, deflate, br','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded','Content-Length': content_length,'Upgrade-Insecure-Requests': '1'}res = s.request('POST','https://h5.qzone.qq.com/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_addcomment_ugc',params=comment_params, data=comment_data, headers=comment_headers, cookies=cookie)print(res.status_code)res = res.textprint(res)commentid = re.findall('"id":(.*?),"postTime"', res)if commentid:f = open('target_qq.txt', 'a')f.write(str(topicid))f.write('  ')f.write(str(commentid[0]))f.write('\n')f.close()print('评论成功')return Trueelse:print('评论失败')return Falseheaders = {'Host': 'h5.qzone.qq.com','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3','Accept-Encoding': 'gzip, deflate, br','Referer': 'https://user.qzone.qq.com/790178228?_t_=0.22746974226377736','Connection': 'keep-alive'
}cookie = {'QZ_FE_WEBP_SUPPORT': '0', 'ptcz': '7cac1c7521b1ad8be9b1489f9b0aaba8efe9500f0f5dcb7693a9f693d37a8dff','fnc': '2', 'skey': '@F6CRfhQVd', 'pgv_si': 's493469696', 'ptui_loginuin': '790178228', 'RK': 'gYFn6+IOYo','pt2gguin': 'o0790178228', 'p_uin': 'o0790178228','rv2': '808A93A64B1A6FC5AE6D906AB5E744B38AF1EAA4163EC57A76', 'ptisp': 'ctc','p_skey': '5Iv6LkqOjJH*JPtrq0xqZmVlBNkbKLCRcDasiGGq71w_', '_qpsvr_localtk': '0.6656868932768703','pgv_pvi': '7208859648', '790178228_todaycount': '4', '__Q_w_s_hat_seed': '1','790178228_totalcount': '24703', 'pgv_pvid': '1698820840', 'qz_screen': '1366x768','pt4_token': 'WeiGzJbrn*TO4HO4FFXRdiD3SpXE2UqW2Litsm-TZPw_', 'pgv_info': 'ssid=s6237051136','uin': 'o0790178228', 'Loading': 'Yes','property20': '9D827FD9F839B247CF95AA1787B450E4D22D6C9F2A76DC8C4D27798667EBB92CA7122514560889AF'}
gtk =""
qzonetoken =""
s = requests.session()
my_qq =""
target_qq =""
content = '加油!'
cnt = 0
for page in range(0, 170):pos = page * 20params = {'uin': target_qq,'ftype': '0','sort': '0','pos': pos,'num': '20','replynum': '100','g_tk': gtk,'callback': '_preloadCallback','code_version': '1','format': 'jsonp','need_private_comment': '1','qzonetoken': qzonetoken}response = s.request('GET', 'https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6',params=params, headers=headers, cookies=cookie)print(response.status_code)text = response.textif not re.search('lbs', text):print('全部说说评论完成,共添加评论%s条' % cnt)exit()textlist = re.split('\{"certified"', text)[0:]for i in range(1, len(textlist)):text = re.sub('"commentlist":.*?"conlist":', '', textlist[i])tid = re.findall('"t1_termtype":.*?"tid":"(.*?)"', text)[0]topicid = target_qq + '_' + str(tid)print(topicid)counts = comment(my_qq=my_qq, target_qq=target_qq, content=content, topicid=topicid, gtk=gtk,qzonetoken=qzonetoken, cookie=cookie)sleep(180)if counts == True:cnt = cnt + 1

二、数据抓取存入数据库

import requests
import re
import datetime
import pymysql
import csv
from qq_mood.qq import QRlogindef parse_mood(i):'''从返回的json中,提取我们想要的字段'''text = re.sub('"commentlist":.*?"conlist":', '', i)if text:myMood = {}myMood["isTransfered"] = Falsetid = re.findall('"t1_termtype":.*?"tid":"(.*?)"', text)[0]  # 获取说说IDtid = qq + '_' + tidmyMood['id'] = tidmyMood['pos_y'] = 0myMood['pos_x'] = 0mood_cont = re.findall('\],"content":"(.*?)"', text)if re.findall('},"name":"(.*?)",', text):name = re.findall('},"name":"(.*?)",', text)[0]myMood['name'] = nameif len(mood_cont) == 2:  # 如果长度为2则判断为属于转载myMood["Mood_cont"] = "评语:" + mood_cont[0] + "--------->转载内容:" + mood_cont[1]  # 说说内容myMood["isTransfered"] = Trueelif len(mood_cont) == 1:myMood["Mood_cont"] = mood_cont[0]else:myMood["Mood_cont"] = ""if re.findall('"created_time":(\d+)', text):created_time = re.findall('"created_time":(\d+)', text)[0]temp_pubTime = datetime.datetime.fromtimestamp(int(created_time))temp_pubTime = temp_pubTime.strftime("%Y-%m-%d %H:%M:%S")dt = temp_pubTime.split(' ')time = dt[1]myMood['time'] = timedate = dt[0]myMood['date'] = dateif re.findall('"source_name":"(.*?)"', text):source_name = re.findall('"source_name":"(.*?)"', text)[0]  # 获取发表的工具(如某手机)myMood['tool'] = source_nameif re.findall('"pos_x":"(.*?)"', text):pos_x = re.findall('"pos_x":"(.*?)"', text)[0]pos_y = re.findall('"pos_y":"(.*?)"', text)[0]if pos_x:myMood['pos_x'] = pos_xif pos_y:myMood['pos_y'] = pos_yidname = re.findall('"idname":"(.*?)"', text)[0]myMood['idneme'] = idnamecmtnum = re.findall('"cmtnum":(.*?),', text)[0]myMood['cmtnum'] = cmtnumreturn myMood
#从csv文件中取qq号,并保存在一个列表中
csv_reader = csv.reader(open('qq.csv'))
friend=[]
for row in csv_reader:friend.append(row[3])
friend.pop(0)
friends=[]
for f in friend:f=f[:-7]friends.append(f)
headers={'Host': 'h5.qzone.qq.com','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0','Accept': '*/*','Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3','Accept-Encoding': 'gzip, deflate, br','Referer': 'https://user.qzone.qq.com/790178228?_t_=0.22746974226377736','Connection':'keep-alive'
}#伪造浏览器头
conn = pymysql.connect('localhost', 'root', 'root', 'test', charset="utf8", use_unicode=True)#连接mysql数据库
cursor = conn.cursor()#定义游标cookie,gtk,qzonetoken=QRlogin.QR_login() #通过登录函数取得cookies,gtk,qzonetoken
s=requests.session()#用requests初始化会话
for qq in friends:#遍历qq号列表for p in range(0,10):pos=p*20params={'uin':qq,'ftype':'0','sort':'0','pos':pos,'num':'20','replynum':'100','g_tk':gtk,'callback':'_preloadCallback','code_version':'1','format':'jsonp','need_private_comment':'1','qzonetoken':qzonetoken}response=s.request('GET','https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6',params=params,headers=headers,cookies=cookie)print(response.status_code)  #通过打印状态码判断是否请求成功text=response.text   #读取响应内容print(text)if not re.search('lbs', text):#通过lbs判断此qq的说说是否爬取完毕print('%s说说下载完成'% qq)breaktextlist = re.split('\{"certified"', text)[1:]for i in textlist:myMood=parse_mood(i)'''将提取的字段值插入mysql数据库,通过用异常处理防止个别的小bug中断爬虫,开始的时候可以先不用异常处理判断是否能正常插入数据库'''try:insert_sql = '''insert into mood(id,content,time,sitename,pox_x,pox_y,tool,comments_num,date,isTransfered,name)VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''cursor.execute(insert_sql, (myMood['id'],myMood["Mood_cont"],myMood['time'],myMood['idneme'],myMood['pos_x'],myMood['pos_y'],myMood['tool'],myMood['cmtnum'],myMood['date'],myMood["isTransfered"],myMood['name']))conn.commit()except:passprint('说说全部下载完成!')

三、结果展示

引用于: https://zhuanlan.zhihu.com/p/27604277

python获取自己发的说说内容相关推荐

  1. 使用python获取天气网页上的内容,并存入数据库

    使用python获取天气网站中的内容,并存入数据库 例如:获取 http://api.help.bj.cn/api/?id=53 中的城市,lever,quality,pm2.5 中的内容** 网站是 ...

  2. Python3-word文档操作(二):利用python获取word文档的内容

    上一篇,学习了是用python的docx库创建一个word文档,并且编辑了标题和正文.本篇继续python操作word之旅:利用python来获取word文档的内容. python脚本: # -*- ...

  3. 【Python获取购物平台APP评论内容】

    Python获取购物平台APP的评论内容 最近研究需要商品评论数据,参考学习了其他大佬的文章.根据我自己不同的数据需求,改写了一个可以爬取购物APP评论数据的爬虫.但是不完全自动,仅供参考和个人学习使 ...

  4. Python获取Redis所有Key以及内容

     一.获取所有Key [python] view plain copy print? # -*- encoding: UTF-8 -*- __author__ = "Sky" ...

  5. 使用Python获取微信朋友圈的内容

    无意中发现个超好用的框架,python居然也能读到朋友圈的内容 方法如下 # Github地址:https://github.com/mrsanshui/WeChatPYAPI # 码云地址:http ...

  6. python获取docx文档的内容(文本)

    首先下载第三方库python-docx: pip install python-docx(在py文件里面导入的时候是import docx) 简单的说,docx里面的每一个段落都是一个paragrap ...

  7. python怎么读文件里的某一行-Python如何获取文件指定行的内容

    linecache, 可以用它方便地获取某一文件某一行的内容.而且它也被 traceback 模块用来获取相关源码信息来展示. 用法很简单: >>> import linecache ...

  8. python读取redis指定key_Python获取Redis所有Key以及内容的方法

    Python获取Redis所有Key以及内容的方法 一.获取所有Key # -*- encoding: UTF-8 -*- __author__ = "Sky" import re ...

  9. python自动保存ping结果_利用python获取Ping结果示例代码

    前言 本文主要跟大家分享了关于利用python获取Ping结果的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧. 示例代码: # -*- coding: utf-8 -*- i ...

最新文章

  1. CTFshow php特性 web90
  2. 最靠谱的解决 Ubuntu 18.04 / Linux mint 19 安装网易云音乐 不能正常点击启动问题
  3. Detectron-MaskRCnn:Mask判别和获取前向Mask的标签
  4. thinkphp session mysql_ThinkPHP实现将SESSION存入MYSQL的方法
  5. 2019 GDUT Rating Contest II : A. Taming the Herd
  6. hive 建表_Hive建表和内外部表的使用
  7. OSChina 周四乱弹 —— 有这个发现自己并不需要女朋友了
  8. OpenLayers 在Vue中增删改
  9. 码神之路博客项目部署
  10. 钣金缺口lisp_【Gu_xl】Lisp程序设计错误处理的技巧
  11. Excel作图-折线图分段显示不同颜色
  12. 2021年茶艺师(初级)考试试卷及茶艺师(初级)模拟考试
  13. X11 xcb 交叉编译
  14. 算法开启队列转栈武魂
  15. PHPCMS模块分析之广告模块详解----北冥神功破解法(二)
  16. 微信小程序github源码大全下载
  17. 链栈的基本操作-C语言
  18. 利用XGBoost特征选择和堆叠集成分类器提高蛋白质-蛋白质相互作用预测精度
  19. windows10计算机管理器,win10设备管理器怎么打开?设备管理器打开的方法
  20. 高职计算机自主招生面试题,高职自主招生面试题

热门文章

  1. 一款分析linux上应用程序分析的工具----0x.tools
  2. Android学习笔记 2.2.1 线性布局 2.2.2 表格布局
  3. Switch游戏机一线直连汽车中控屏方案(支持PD100W快充已经视频传输)
  4. 阿里云maven仓库无法下载SpringCloud相关依赖问题
  5. JAVA 8 接口中的默认方法和Lambda 表达式基本使用
  6. Memblaze发布企业级数据存储管理系统FlashRAID——从NVMe SSD出发,全面进击软件定义存储
  7. 2021-2027全球及中国散热器软管行业发展现状调研及投资前景分析报告
  8. PTA-c语言 洛希极限
  9. linux系统编程:暂停函数pause
  10. Chronometer 计时器的实现