最近自己玩爬虫玩得很嗨。想到爬QQ空间主要是因为在看网课的时候有不少人刷弹幕要去爬前女友空间。。咳咳,虽然我没有前女友,但是这不失为一个有趣的练手机会。(爬完之后发现不会留下访客记录!确实很适合爬前女友空间hh)写这篇博客主要是想捋一捋思路。

先贴一下主要参考的博客:
参考博客1
参考博客2

目标

爬取QQ好友的说说内容,保存到文件,分析词频生成词云。

1.登录网页版QQ

首先进入QQ空间网页版,我们需要先登录进入自己的空间。这个时候就用selenium来模拟人的操作。具体来说就是先点击“账号密码登录”,定位账号、密码输入框并输入相应内容,定位登录按钮,点击登录。
要注意的是这个页面是有框架的,在源码里可以看到"login_frame",所以要先切换到框架。

def login():# 无头浏览器的写法# chrome_options = Options()# chrome_options.add_argument('--headless')# chrome_options.add_argument('--disable-gpu')# driver = webdriver.Chrome(options=chrome_options)driver = webdriver.Chrome()driver.get(login_url)driver.switch_to.frame('login_frame')#切换到账号密码登录log_method = driver.find_element_by_id('switcher_plogin')log_method.click()#输入账号密码,登录account_input = driver.find_element_by_id('u')account_input.send_keys(account)password_input = driver.find_element_by_id('p')password_input.send_keys(password)login_button = driver.find_element_by_id('login_button')login_button.click()time.sleep(5)driver.switch_to.default_content()return driver

这个还是很容易实现的。我没有用无头浏览器,因为还可以看一看自己有没有被验证码卡住hh,被卡住的话后续会抛出异常。

2.目标站点分析

然后我就选择了一个好友的空间进入,看“说说”界面的源代码,会发现源代码里面没有半点“说说”的内容,这个时候就要抓包、不能直接上了。

可以看到有这么些东西,点开一个查看Headers(下面这个是打开了emotion_cgi_msglist_v6?uin=…),可以复制Request URL到浏览器里看一看内容,可以看到有好友说说的内容。说明我们应该是请求这个url来获取说说内容。
接下来分析这个url,有几个参数我们要注意。一个是uin,后面很明显接的是好友的QQ号。所以我们可以先获取一个好友QQ号的列表,之后作为参数传进来。第二个是pos,后面接的是页码,要爬取多页的内容就可以控制它来翻页。然后是g_tk,这个参数有两处,它是一个经过加密生成的随机串(你会发现不同时候打开的值是不同的),通过cookie可以获取加密后的g_tk,这里直接搬运的大佬的方法。最后是qzonetoken,这个是在登录页面里面获取的,具体怎么也不是很懂,直接搬运了。

3.cookie和session

分析完站点之后就要重新规划一下了。首先要搞定这个cookie和session的问题。之前做了好几个实例都没有碰到这方面的内容,这里补充一下。
cookie和session
额,不懂,多做几个实例应该就理解了。
这里放出构造session的方法,之后就可以用session来访问登录后的网页了。

def back_session(cookie):# 创建一个session对象my_session = requests.session()headers = {'host': 'h5.qzone.qq.com','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9','accept': '*/*','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}# 将字典转为cookiejar,这样就可以将cookie赋给sessionc = requests.utils.cookiejar_from_dict(cookie, cookiejar=None, overwrite=True)my_session.headers = headers# 将cookie赋给sessionmy_session.cookies.update(c)return my_session

4.生成g_tk和qzonetoken

这一块原理都不怎么懂,直接放代码。

#生成g_tk
def get_g_tk(cookie):hashes = 5381for letter in cookie['p_skey']:hashes += (hashes << 5) + ord(letter)return hashes & 0x7fffffff
    # 获取qzonetoken driver = login()html = driver.page_sourcexpat = r'window\.g_qzonetoken = \(function\(\)\{ try\{return (.*?);\} catch\(e\)'qzonetoken = re.compile(xpat).findall(html)[0]# print(type(qzonetoken))qzonetoken = qzonetoken.strip('\"')

5.获取好友QQ号列表

点这个玩意儿

同样也是抓包,跟上面操作类似,一个叫friend_ship_manager…的里面的Request URL会有好友信息,如下:

uin里面就是QQ号,所以通过这个url来获取QQ号列表就可以啦。这个url里面的参数也就是上面说的那几个。

6.获取说说内容

url分析在上面“目标站点分析”里面做过了。接下来就是获取内容(这里主要是获取的文本),对文本进行处理(一堆表情符什么的真的是搞死我了),写入到文件。
从HTML里面获取最基本的文本,这里用的是正则。

    cpat = '"certified".*?"conlist":(.*?),'resp = my_session.get(url)content_list = re.compile(cpat, re.S).findall(resp.text)

得到的content_list大概是这样一个东西:

['[{"con":"背的全不考,考的全不会,补考考场见"', 'null', '[{"con":"我再也不想晚上喝茶颜了"', '[{"con":"以后再也不拖了orz"', '[{"con":"我这种人大概不适合出门"', '[{"con":"求赞(妄想88个)"', '[{"con":"打扰了,我就是家里没矿的[em]e297[\\/em]"']

我对它做了一下处理,我只想要正文内容,其他的都不想要。业务不熟练,我用了三个正则。。
(虽然觉得有点傻。。但是目前还不知道有什么其他方法。。)
第一个正则选出了"con":"…",省略号部分的东西
第二个正则去掉了[em]之类的东西
第三个正则去掉了e297这样的东西
(然而后来发现还是没有完全达到我想要的效果,不过也差不多了。。不为难自己了,还有换行符不知道为什么就是处理不掉,以及很要命的颜文字。。)

def change(list):content = ",".join(list)cpat = '"con":"(.*?)".*?"con":'epat = '\[.*?\]'mpat = '\w\d{3,6}\w?'data = re.compile(cpat, re.S).findall(content)data1 = " ".join(data)data2 = re.sub(epat, "", data1)res = re.sub(mpat, "", data2)return res

获得的res把它写入文件。写入的时候颜文字就来捣乱了,会有编码错误emmm

UnicodeEncodeError: 'gbk' codec can't encode character '\uff61' in position 103: ...

搜了一下有点晕,不知道怎么处理,就直接捕获,然后略过了(后面优化的时候解决了)

7.生成词云

直接贴了。这里涉及到好几个库要自己下。
这里用jieba.analyse做了分词,不用这一步的话生成的比较像短句而不是词语。

def wordcloud():# 读入背景图片abel_mask = np.array(Image.open("背景图片的路径"))# 读取要生成词云的文件lyric = open('存放说说内容的文件的路径', encoding='gbk').read()#分词result = jieba.analyse.textrank(lyric,topK=50,withWeight=True)keywords = dict()for i in result:keywords[i[0]] = i[1]print(keywords)my_wordcloud = WordCloud(background_color='white',  # 设置背景颜色mask=abel_mask,  # 设置背景图片max_words=200,  # 设置最大现实的字数stopwords=STOPWORDS,  # 设置停用词width=890,height=589,font_path='C:/Users/Windows/fonts/simkai.ttf',  # 设置字体格式,如不设置显示不了中文max_font_size=200,  # 设置字体最大值random_state=30,  # 设置有多少种随机生成状态,即有多少种配色方案scale=.5).generate_from_frequencies(keywords)# 根据图片生成词云颜色image_colors = ImageColorGenerator(abel_mask)# 以下代码显示图片plt.imshow(my_wordcloud)plt.axis("off")plt.show()

8.优化

一个晚上加一个上午就做到了这里,后面还会继续优化,可以优化的地方:
1.上面获取好友说说内容的时候是没有翻页的,当时懒得做翻页,但是发现数据量还挺小的。
2.太慢了,改进程池。

目前生成的词云是这样的:

一点都不有趣OK???枯了

PS:做了优化:

1.增加了翻页功能
2.解决了上面说的遇到颜文字的时候的编码错误,做了如下两步改动:

#把抓取的内容写入文件(加了encoding)
def save(content):try:with open(file_name,'a+', encoding="utf-8") as file:file.write(content)except UnicodeError:print("出现了编码错误")

相应的,在读文件生成词云的时候(encoding换成utf-8):

 # 读取要生成词云的文件lyric = open('shuoshuo.txt', encoding='utf-8').read()

3.进程池。。实在是无能为力
这次爬到一半还被反爬了,哭了。词云还是如此无聊(而且和图片的拟合度真的很低):

python爬取QQ空间好友说说并生成词云相关推荐

  1. python爬取陌生人的qq空间_Python爬取QQ空间好友说说并生成词云(超详细)

    前言 先看效果图: 思路 1.确认访问的URL 2.模拟登录你的QQ号 3.判断好友空间是否加了权限,切换到说说的frame,爬取当前页面数据,下拉滚动条,翻页继续获取 爬取的内容写入本地TXT文件中 ...

  2. 爬取qq音乐的评论并生成词云——以《听妈妈的话》为例

    爬取qq音乐的评论并生成词云 我们选取的是歌曲的周杰伦的 听妈妈的话 先看效果图 首先,我们进去qq音乐找到这首歌 网易云出来挨打 https://y.qq.com/n/yqq/song/002hXD ...

  3. python + selenium +chrome爬取qq空间好友说说并存入mongodb数据库

    python + selenium +chrome爬取qq空间好友说说并存入mongodb数据库 准备阶段 在正式开始在前需要先准备好做爬虫的工具,本例使用chrome无头浏览器进行爬取工作,也可使用 ...

  4. python爬取好友qq空间_python + selenium +chrome爬取qq空间好友说说并存入mongodb数据库...

    title: python + selenium +chrome爬取qq空间好友说说并存入mongodb数据库 准备阶段 在正式开始在前需要先准备好做爬虫的工具,本例使用chrome无头浏览器进行爬取 ...

  5. python爬取加密qq空间_使用python+selenium爬取qq空间好友动态

    使用python+selenium爬取qq空间好友动态 分析过程如下: 要想用selenium登陆qq空间,必须点击账号密码登陆按钮然后再填写账号密码登陆. 1.PNG 点击账号密码按钮后跳转到如下页 ...

  6. php取qq空间说说id,Python爬取qq空间说说的实例代码

    具体代码如下所示: #coding:utf-8 #!/usr/bin/python3 from selenium import webdriver import time import re impo ...

  7. python爬取qq空间锁密图片_Python3爬取QQ空间信息(下)

    |下载W3Cschool手机App,0基础随时随地学编程>>戳此了解| 导语 内容回顾: Python爬取QQ空间信息(上) 按照(上)中的安排,本期内容为抓取QQ空间的好友信息并做可视化 ...

  8. 爬虫实战-python爬取QQ群好友信息

    自从开始学习爬虫后,总是无法控制那一颗躁动的心.每天总是想要爬点什么,爬过电影.爬过电影影评.爬过图片(美女图).爬过视频链接,从最初的简单解析网页到模拟登陆再到异步加载,现在看到一个网页最先想的就是 ...

  9. 用python爬取qq空间内容_利用Fiddler抓包和py的requests库爬取QQ空间说说内容并写入文件...

    [Python] 纯文本查看 复制代码#!C:\Program Files\Python36 python # -*- coding: UTF-8 -*- """ @au ...

最新文章

  1. 史上最强 NIO 框架,没有之一!!!
  2. python项目2019_2019 年 11 月精选 GitHub 上 几个牛逼 Python 的项目
  3. 解决使用Navicat等工具进行连接登录mysql的1130错误,无法使用Ip远程连接的问题(mysql为8.0版本)
  4. Java面向对象抽象类案例分析
  5. 什么叫优雅降级和渐进增强
  6. verilog学习(1)基本语法
  7. 彻底崩溃,一个电脑白痴和黑客的对话!
  8. ECStore在Win环境下如何运行CMD命令
  9. 一道头条面试题,小夕差点没读懂题目,找出数组中缺失的数字,最近击败100%的用户!...
  10. 树形DP+二分(Information Disturbing HDU3586)
  11. 不知道这十项 Linux 常识,别说自己是运维工程师!
  12. 使用tushare数据进行backtrader回测
  13. Butterworth滤波器设计(IIR类型)
  14. 大数据助力普惠金融发展
  15. 国密PSAM卡与CPU(用户卡)操作过程 小结
  16. 支付宝RAS密钥生成器SHAwithRSA1024_V1.0打开后窗口一闪而过迅速关闭的解决办法
  17. 新手预算2000元左右买什么吉他好?高性价比单板民谣吉他推荐
  18. HTML网页设计: 一 HTML的基本结构
  19. 【项目】Vue3+TS 动态路由 面包屑 查询重置 列表
  20. shader 雪 顶点位移_游戏雪天效果·积雪的厚度

热门文章

  1. 超详细的【区块链】技术介绍整理(七千余字+九大板块)
  2. 一个完整的嵌入式程序_放下偏见,原来嵌入式程序员如此“妖娆”!
  3. 全部开源!高仿微信界面
  4. 1、SONIX单片机新建工程与烧录流程
  5. 微信小程序开发-微信支付之免密支付(自动扣费)一 小程序+java接口
  6. CMD 创建初始化Vue项目
  7. 网易我的世界手机版服务器文件在哪个文件夹,网易我的世界手机版怎么导入地图_手机版地图导入教程...
  8. 获取键盘按下的键位对应ask码
  9. QOS中 PQ,CQ.RR,WFQ,CBWFQ,LLQ区分(上)
  10. 10a大电流稳压芯片_IC芯片大小的完整10A DC/DC电源