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&amp;MongoDB爬取图书馆借阅记录
Feb 05 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
python如何在循环引用中管理内存
Mar 20 Python
python如何通过实例方法名字调用方法
Mar 21 Python
python中for用来遍历range函数的方法
Jun 08 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
Python搭建HTTP服务过程图解
Dec 14 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
python drf各类组件的用法和作用
Jan 12 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中addslashes函数与sql防注入
2014/11/17 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
vue中的router-view组件的使用教程
2018/10/23 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
django orm 通过related_name反向查询的方法
2018/12/15 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
python实现随机加减法生成器
2020/02/24 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
python算的上脚本语言吗
2020/06/22 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
教育科研先进个人材料
2014/01/26 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
网吧温馨提示
2015/07/17 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
你知道Java Spring的两种事务吗
2022/03/16 Java/Android
MySQL Server层四个日志的实现
2022/03/31 MySQL
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python