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使用PIL模块实现给图片打水印的方法
May 22 Python
Python+django实现文件上传
Jan 17 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
python sort、sort_index方法代码实例
Mar 28 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
基于python实现地址和经纬度转换
May 19 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
Python中re模块的元字符使用小结
Apr 07 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
使用字符串函数输出整数化的PHP版本号
2006/10/09 PHP
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
犀利的js 函数集合
2009/06/11 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
Python的历史与优缺点整理
2020/05/26 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
化学相关工作求职信
2013/10/02 职场文书
英文版餐饮运营管理求职信
2013/11/06 职场文书
大学生期末自我鉴定
2014/02/01 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
大学生社会实践方案
2014/05/11 职场文书
派出所所长先进事迹
2014/05/19 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android