Python爬取qq空间说说的实例代码


Posted in Python onAugust 17, 2018

具体代码如下所示:

#coding:utf-8
#!/usr/bin/python3
from selenium import webdriver
import time
import re
import importlib2
import sys
importlib2.reload(sys)
def startSpider():
  driver = webdriver.Chrome('/Users/zachary/zachary/chromedriver.exe') #这个是chormedriver的地址
  driver.get('https://qzone.qq.com/')
  driver.switch_to.frame('login_frame')
  driver.find_element_by_id('switcher_plogin').click()
  driver.find_element_by_id('u').clear()
  driver.find_element_by_id('u').send_keys('QQ号') #这里填写你的QQ号
  driver.find_element_by_id('p').clear()
  driver.find_element_by_id('p').send_keys('QQ密码') #这里填写你的QQ密码
  driver.find_element_by_id('login_button').click()
  time.sleep(2)
  #设置爬取内容保存路径
  f = open('/Users/zachary/Documents/shuoshuo.txt','w')
  #---------------获得g_qzonetoken 和 gtk
  html = driver.page_source
  '''g_qzonetoken=re.search('window\.g_qzonetoken = \(function\(\)\{ try\{return (.*?);\} catch\(e\)',html)#从网页源码中提取g_qzonetoken'''
  g_qzonetoken = "e794139a284d6ea9e0b26826e541b55df37d0667a3544f534de25aebdb64628d3ab75e1d7104bbb22a"
  cookie = {}#初始化cookie字典
  for elem in driver.get_cookies():#取cookies
    cookie[elem['name']] = elem['value']
  gtk=getGTK(cookie)#通过getGTK函数计算gtk
  #print(g_qzonetoken)
  #print(gtk)
  #--------------获得好友列表  注意下面的链接
  driver.get('https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_hat_get.cgi?hat_seed=1&uin=你的QQ号fupdate=1&g_tk='+str(gtk)+'&qzonetoken='+str(g_qzonetoken)+'&g_tk='+str(gtk))
  friend_list = driver.page_source
  friend_list = str( friend_list )
  abtract_pattern = re.compile('\"(.\d*)\":\{\\n"realname":"(.*?)"}',re.S)
  QQ_name_list = re.findall(abtract_pattern,str(friend_list)) #数组
  print(QQ_name_list)
  numList=dict()# numList => (QQnum:QQname) #列表
  for i in QQ_name_list:
    numList[str(i[0])]=str(i[1])
  begin = 0
  last_source = ""
  tag = 1
  first = 0
  firstTime=""
  #如果要爬取自己的说说,手动添加自己的qq号
  #numList['你的qq号']='你的名字'
  #print(numList)
  for key in numList.keys():
    QQnum = key
    QQname = numList[QQnum]
    if QQnum == "好友qq号": #根据qq号查找指定好友说说
      count = 1
      begin = 0
      while tag==1 :
        #-------------进入好友说说页面                                    #'+QQnum+'       '+str(begin)+'
        #print("Begin:"+str(begin))
        driver.get('https://user.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin='+QQnum+'&ftype=0&sort=0&pos='+str(begin)+'&num=40&replynum=200&g_tk='+str(gtk)+'&callback=_preloadCallback&code_version=1&format=jsonp&need_private_comment=1&qzonetoken='+str(g_qzonetoken)+'&g_tk='+str(gtk))
        try:
          msg_list_json = driver.page_source
        except:
          begin = begin + 40
          continue
        msg_list_json = str(msg_list_json)
        if last_source==msg_list_json :
          break
        else:
          last_source=msg_list_json
        #检测是否没有权限访问
        abtract_pattern = re.compile(',"message":"(.*?)","name":',re.S)
        message = re.findall(abtract_pattern,str(msg_list_json))
        if message!=[]:
          if str(message[0])=='对不起,主人设置了保密,您没有权限查看':#对不起,主人设置了保密,您没有权限查看
            break
        #print(msg_list_json)
        #解析JSON
        #webDriver没有现成的JSON解析器,所以采用获取源码的方式,然后使用正则表达式获取具体细节
        msg_list_json = msg_list_json.split("msglist")[1]#拆分json,缩小范围,也能加快解析速度
        msg_list_json = msg_list_json.split("smoothpolicy")[0]
        msg_list_json = msg_list_json.split("commentlist")[1:]
        #说说动态分4种:1、文字说说(或带有配图的文字说说)
        #       2、只有图片的说说
        #       3、转发,并配有文字
        #       4、转发,不配文字
        for text in msg_list_json:
          # 1、先检查说说,用户是否发送了文字,如果没有文字,正则表达式匹配无效
          abtract_pattern = re.compile('\}\],"content":"(.*?)","createTime":"(.*?)","created_time":(.*?),"',re.S)
          msg_time = re.findall(abtract_pattern,str(text))
          if msg_time!=[]:
            # 2、如果作者说说有文字,那么检查是否有转发内容
            msg = str(msg_time[0][0])
            sendTime = str(msg_time[0][1])
            abtract_pattern = re.compile('\}\],"content":"(.*?)"},"rt_createTime":"(.*?)","',re.S)
            text = text.split("created_time")[1]
            msg_time2 = re.findall(abtract_pattern,str(text))
            #合并发送内容 格式:评论+转发内容
            if msg_time2!=[]:
              msg = msg +" 转发内容:"+str(msg_time2[0][0])
          else:
            # 3、说说内容为空,检查是否为 =>只有图片的说说 or 转发,不配文字
            #获取正文发送时间 (发送时间分为:正文发送时间 or 转发时间)
            abtract_pattern = re.compile('"conlist":null,"content":"","createTime":"(.*?)",',re.S)
            msgNull_time = re.findall(abtract_pattern,str(text))
            if msgNull_time!=[]:
              #如果有正文发送时间,那么就是这条说说仅含有图片 =>只有图片的说说
              msg = "图片"
              sendTime = str(msgNull_time[0])
            else:
              #如果没有正文发送时间,那么就是说这条说为 =>转发,不配文字
              abtract_pattern = re.compile('\}\],"content":"(.*?)"},"rt_createTime":"(.*?)","',re.S)
              msg_time = re.findall(abtract_pattern,str(text))
              msg =" 转发内容:"+str(msg_time[0][0])
              sendTime = str(msg_time[0][1])
          #写入本地文件
          #f.write('{},{},{},{}\n'.format(str(QQname),str(QQnum),sendTime,msg))
          print(str(count)+" : "+str(QQname)+" : "+str(QQnum)+" : "+sendTime+" : "+msg)
          count = count + 1
        begin = begin + 40
def getGTK(cookie):
  hashes = 5381
  for letter in cookie['p_skey']:
    hashes += (hashes << 5) + ord(letter)
  return hashes & 0x7fffffff
startSpider()
print("爬取结束")

总结

以上所述是小编给大家介绍的Python爬取qq空间说说的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
python 寻找优化使成本函数最小的最优解的方法
Dec 28 Python
python实现学生管理系统
Jan 11 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
Python3 assert断言实现原理解析
Mar 02 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
Python OpenCV快速入门教程
Apr 17 Python
Python数组变形的几种实现方法
May 30 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 Python
django进阶之cookie和session的使用示例
Aug 17 #Python
Django 登陆验证码和中间件的实现
Aug 17 #Python
python读取Excel实例详解
Aug 17 #Python
python框架中flask知识点总结
Aug 17 #Python
Flask Web开发入门之文件上传(八)
Aug 17 #Python
python操作excel的方法
Aug 16 #Python
python3调用百度翻译API实现实时翻译
Aug 16 #Python
You might like
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
python cookielib 登录人人网的实现代码
2012/12/19 Python
python数据结构树和二叉树简介
2014/04/29 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
商务日语专业毕业生求职信
2013/10/26 职场文书
运动会广播稿500字
2014/01/28 职场文书
美术教师自我鉴定
2014/02/12 职场文书
啦啦队口号大全
2014/06/16 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
网络销售员岗位职责
2015/04/11 职场文书
详解Python中*args和**kwargs的使用
2022/04/07 Python
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python