QQ机器人爬取百度文库链接推送好友并生成词云

  • 一、环境准备
  • 二、实现QQ机器人
    • 1.QQ机器人介绍
    • 2.安装方法
    • 3.实现自己的QQ机器人
  • 三、百度文库内容链接爬取推送好友
    • 代码实现:
    • 思路分析
      • 1.获取好友搜索关键词
      • 2.爬取百度文库链接的关键类pyth
        • 1)编码格式转换
        • 2)request请求
        • 3)正则表达式
        • 4)返回结果数据
  • 四、内容爬取保存至本地
    • 代码实现
    • 思路分析
      • 1)通过session会话对象获取请求
      • 2)按照输入的网址,自动判断文档类型(pdf、word、txt保存为txt,ppt自动保存为图片格式)
      • 3) 正则表达式过滤数据
      • 4) 文件存储
  • 五、根据文本内容生成词云
    • 代码实现:
    • 思路分析
      • 1)获取初始文件
      • 2)结巴分词
      • 3)设置背景图片
      • 4)设置停用词

一、环境准备

安装包:
qqbot_spider:

  • from qqbot import QQBotSlot as qqbotslot, RunBot
  • import urllib.request, urllib, re

baiduwenku_pro:

  • import requests
  • import re
  • import json
  • import os

baiduwenku_wordcloud:

  • from os import path
  • from PIL import Image
  • import numpy as np
  • import matplotlib.pyplot as plt
  • import os

二、实现QQ机器人

1.QQ机器人介绍

QQBot 是一个用 python 实现的、基于腾讯 SmartQQ 协议的简单 QQ 机器人,可运行在 Linux 、 Windows 和 Mac OSX 平台下。

你可以通过扩展 QQBot 来实现:

  • 监控、收集 QQ 消息
  • 自动消息推送
  • 聊天机器人
  • 通过 QQ 远程控制你的设备

2.安装方法

pip install qqbot

3.实现自己的QQ机器人

QQ 机器人启动后,用另外一个 QQ 向本 QQ 发送消息即可操作 QQBot 。目前提供以下命令:

  • 列出 好友/群/讨论组: -List buddy/group/discuss
  • 向 好友/群/讨论组 发送消息: -SendTo buddy/group/discuss message
  • 停止 QQBot :-Stop()
from qqbot import QQBotSlot as qqbotslot, RunBot@qqbotslot
def onQQMessage(bot, contact, member, content):
#其中onQQMessage()消息响应函数    bot:QQBot 对象   contact:QContact 对象,消息的发送者  member:QContact 对象,仅当本消息为 群消息或讨论组消息 时有效,代表实际发消息的成员  content:str 对象,消息内容if content == '-hello':bot.SendTo(contact, '您好!我是QQ机器人')elif content == '-stop':bot.SendTo(contact, 'QQ机器人已关闭')bot.stop()if __name__ == "__main__":RunBot()

三、百度文库内容链接爬取推送好友

代码实现:

from qqbot import QQBotSlot as qqbotslot, RunBot
import urllib.request, urllib, re
import baiduwenku_pro
import baiduwenku_wordcloudclass pyth(object):def baidu(self, world):data = {}data['word'] = worldurl_World = urllib.parse.urlencode(data, encoding="GBK") #urlencode的参数是词典,它可以将key-value这样的键值对转换成我们想要的格式url = "https://wenku.baidu.com/search?" + url_World + "&org=0&ie=gbk" #url拼接page = urllib.request.urlopen(url) #获取页面,page的数据格式为bytes类型,需要decode()解码,转换成str类型html = page.read()html = html.decode('gbk')title = re.compile(r'<span title=".*?" class="ic ic-.*?title="(.*?)"', re.S) #正则表达式获取titleurl1 = re.compile(r'<span title=".*?" class="ic .*?<a href="(.*?)"', re.S) #正则表达式获取url系列数据title1 = re.findall(title, html)url11 = re.findall(url1, html)pri = "百度文库搜索结果:"if len(title1) > 2:for i in range(2):pri += "\n" + title1[i] + "\n链接:" + url11[i];# print(url11[i])filename = baiduwenku_pro.main(url11[i])print(filename)if filename != "":baiduwenku_wordcloud.main(filename)else:pri = "相关内容过少,请换个题目"return pri@qqbotslot
def onQQMessage(bot, contact, member, content):if "搜索" in content[0:2]:  #获取搜索的关键词  即都是以 搜索+关键词 的形式if len(content) > 2:world = content.split("搜索", 1)[1].encode('gbk')run = pyth()run.baidu(world)jieguo = run.baidu(world).encode("utf-8")bot.SendTo(contact, jieguo)if __name__ == "__main__":RunBot()

思路分析

1.获取好友搜索关键词

from qqbot import QQBotSlot as qqbotslot, RunBot@qqbotslot
def onQQMessage(bot, contact, member, content):if "搜索" in content[0:2]:if len(content) > 2:world = content.split("搜索", 1)[1].encode('gbk')if __name__ == "__main__":RunBot()

2.爬取百度文库链接的关键类pyth

1)编码格式转换

看一下百度文库搜索"大学":

其中%CE%C4%B5%B5就是"文档"的十六进制。也就是说我们想搜索“文档”的相关内容需要把“大学”的中文转成上面格式,如果不转会出现什么状况,如果我们直接把中文“大学”塞到链接里去访问:https://wenku.baidu.com/search?word=文档&lm=0&od=0&fr=top_home&ie=gbk
就会出现

会有乱码这个乱码直接导致后面获取原网页解码错误也就是:
html = html.decode(‘gbk’)
解码是让中文能够正常显示,但是上面的乱码是不能通过gbk编码进行解码的,也就会出现错误。
所以不能直接把参数world直接放进去。
而urllib.parse.urlencode(data)这行代码就是把中文转成url格式的。

data = {}
data['word'] = world
url_World = urllib.parse.urlencode(data, encoding="GBK")
url = "https://wenku.baidu.com/search?" + url_World + "&org=0&ie=gbk"
2)request请求

通过request请求得到搜索结果的page,并进行编码格式转换

 page = urllib.request.urlopen(url)html = page.read()html = html.decode('gbk')
3)正则表达式

通过正则表达式,将得到的数据进行结果筛选

title = re.compile(r'<span title=".*?" class="ic ic-.*?title="(.*?)"', re.S)
url1 = re.compile(r'<span title=".*?" class="ic .*?<a href="(.*?)"', re.S)
title1 = re.findall(title, html)
url11 = re.findall(url1, html)
4)返回结果数据

在正则表达式对爬取的数据进行筛选之后,对结果数据进行拼接

pri = "百度文库搜索结果:"
if len(title1) > 2:for i in range(2):pri += "\n" + title1[i] + "\n链接:" + url11[i];# print(url11[i])filename = baiduwenku_pro.main(url11[i])print(filename)if filename != "":baiduwenku_wordcloud.main(filename)
else:pri = "相关内容过少,请换个题目"
return pri

四、内容爬取保存至本地

代码实现

import requests
import re
import json
import ossession = requests.session() #使用session可以跨请求地保持某些参数#获取源码
def fetch_url(url):return session.get(url).content.decode('gbk')  #设置gbk编码格式#获取文档id
def get_doc_id(url):return re.findall('view/(.*).html', url)[0]#获取文档类型
def parse_type(content):return re.findall(r"docType.*?\:.*?\'(.*?)\'\,", content)[0]#获取文档标题
def parse_title(content):return re.findall(r"title.*?\:.*?\'(.*?)\'\,", content)[0]def parse_doc(content):result = ''url_list = re.findall('(https.*?0.json.*?)\\\\x22}', content)url_list = [addr.replace("\\\\\\/", "/") for addr in url_list]for url in url_list[:-5]:content = fetch_url(url)y = 0txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', content)for item in txtlists:if not y == item[1]:y = item[1]n = '\n'else:n = ''result += nresult += item[0].encode('utf-8').decode('unicode_escape', 'ignore')return resultdef parse_txt(doc_id):content_url = 'https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=' + doc_idcontent = fetch_url(content_url)md5 = re.findall('"md5sum":"(.*?)"', content)[0]pn = re.findall('"totalPageNum":"(.*?)"', content)[0]rsign = re.findall('"rsign":"(.*?)"', content)[0]content_url = 'https://wkretype.bdimg.com/retype/text/' + doc_id + '?rn=' + pn + '&type=txt' + md5 + '&rsign=' + rsigncontent = json.loads(fetch_url(content_url))result = ''for item in content:for i in item['parags']:result += i['c'].replace('\\r', '\r').replace('\\n', '\n')return resultdef parse_other(doc_id):content_url = "https://wenku.baidu.com/browse/getbcsurl?doc_id=" + doc_id + "&pn=1&rn=99999&type=ppt"content = fetch_url(content_url)url_list = re.findall('{"zoom":"(.*?)","page"', content)url_list = [item.replace("\\", '') for item in url_list]if not os.path.exists(doc_id): #创建一个doc_id的文件夹用来保存爬取的ppt的图片os.mkdir(doc_id)for index, url in enumerate(url_list):content = session.get(url).contentpath = os.path.join(doc_id, str(index) + '.jpg')with open(path, 'wb') as f: #使用with语句 来自动帮我们调用close()方法f.write(content)print("图片保存在" + doc_id + "文件夹")def save_file(filename, content):with open(filename, 'w', encoding='utf8') as f:f.write(content)print('已保存为:' + filename)return filenamedef main(url):# url = input('请输入要下载的文库URL地址')content = fetch_url(url)doc_id = get_doc_id(url)type = parse_type(content)title = parse_title(content)if type == 'doc':result = parse_doc(content)return save_file(title + '.txt', result)elif type == 'txt':result = parse_txt(doc_id)return save_file(title + '.txt', result)else:parse_other(doc_id)return ""

思路分析

1)通过session会话对象获取请求

使用会话对象请求是为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

2)按照输入的网址,自动判断文档类型(pdf、word、txt保存为txt,ppt自动保存为图片格式)

word类型文档:
ppt类型文档:

txt类型文档:

3) 正则表达式过滤数据


findall查找全部r标识代表后面是正则的语句

findall(string[, pos[, endpos]])

其中,string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。

findall 以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表。

4) 文件存储

判断当前爬取的数据是.doc .txt .pdf文本格式还是.ppt文本格式,如果是.doc .txt .pdf文本格式则全部存储为.txt文本,反之则存储为图片格式

五、根据文本内容生成词云

代码实现:

from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import osfrom wordcloud import WordCloud, STOPWORDS, ImageColorGeneratordef main(filename):d = path.dirname(__file__)# 打开初始文件text = open(path.join(d, filename), encoding='utf-8').read()import jieba# 结巴分词wordlist = jieba.cut(text, cut_all=True)wl = " ".join(wordlist)# print(wl)  # 输出分词之后的txtcoloring = np.array(Image.open(path.join(d, "bj.png")))#其中bj.png是背景图片# 设置停用词stopwords = set(STOPWORDS)  # STOPWPRD自带的是英文停用词stopwords.update(["然而", "这样", "另一方面", "但是", "因此", "我们", "一个", "如果",'它们', '具有', '人们', '可以', '这个', '这种', '不能', '因为','或者', '没有', '这些', '一种', '非常', '可能', '他们', '而且','所有', '也许', '就是', '认为', '正如', '必须', '确定', '所以','任何', '发生', '甚至', '能够', '过去', '对于', '知道', '这是','现在', '不同', '并且', '似乎', '那样', '其他', '什么', '不是','那么', '一点', '已经', '之间', '如何', '仍然'])  # 添加中文停用词# 你可以通过 mask 参数 来设置词云形状wc = WordCloud(background_color="white", max_words=2000, mask=coloring,max_font_size=50, random_state=42, font_path='C:/Windows/Fonts/STXINGKA.TTF')#其中mask参数的意义  WordCloud(backgroud_color=" ",max_words=任意数字,mask=上一步的coloring,max_font_size=自己设定,random_state=变化的范围,scale=生成图片和原图的大小倍数,font_path=字体路径)wc.generate(wl)# 创建图片颜色image_colors = ImageColorGenerator(coloring)# 显示# 在只设置mask的情况下,你将会得到一个拥有图片形状的词云plt.imshow(wc, interpolation="bilinear")plt.axis("off")plt.figure()plt.show()#去掉文本的后缀并拼接为.jpg图片格式name=os.path.splitext(filename)[0]+'.jpg'#保存图片到本地文件wc.to_file(name)

思路分析

1)获取初始文件

使用open().read()读取txt文本中的文字

2)结巴分词

jieba.cut方法接受两个输入参数:

  • 第一个参数为需要分词的字符串
  • cut_all参数用来控制是否采用全模式

3)设置背景图片

通过masks参数来设置背景图片以及词云的形状,不过在使用mask参数的时候,记得将图片灰度化

4)设置停用词

通过stopwords = set(STOPWORDS)来设置停用词,也就是遇到这些词的时候就跳过,并不将它拉入词云的词频范围内,设置中文停用词可以使用update函数

python生成QQ机器人爬取百度文库链接推送好友并生成词云相关推荐

  1. 使用python中的Selenium爬取百度文库word文章

    参考文章:Python3网络爬虫(九):使用Selenium爬取百度文库word文章,链接为: https://blog.csdn.net/c406495762/article/details/723 ...

  2. python爬取qq好友_Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)...

    一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有request ...

  3. python 爬虫——爬取百度文库VIP内容

    转载自:爬取百度文库 代码实现 import requests import re import json import ossession = requests.session()def fetch ...

  4. 写一个爬虫,可以爬取百度文库内容

    爬取百度文库内容需要使用爬虫技术.以下是一个简单的 Python 爬虫示例: import requestsurl ="https://wenku.baidu.com/view/your_d ...

  5. 使用python和PyQt5编写爬取百度图片的界面工具

    使用python和PyQt5编写爬取百度图片的界面工具 本篇文章的主要内容是展示我个人编写的,以界面小工具的方式爬取百度上面的图片,功能很单一,根据关键词爬取图片,代码很简单,新手上路请多指教. 代码 ...

  6. Python爬虫实战之爬取百度贴吧帖子

    Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...

  7. python爬取百度文库doc_Python百度文库爬虫之doc文件

    Python百度文库爬虫之doc文件 说明:此文件是在爬取txt文件下的基础进行的,因此重复内容会一笔带过,不懂请看前面爬取txt文件链接 对于文件的所有类型,我都会用一篇文章进行说明,链接: 一.网 ...

  8. go爬取json_Python爬取百度文库学习

    首先先分享下github这篇文章吧,参考了部分代码,但我想做一个很详细的解读. 新版百度文库爬虫 · Jack-Cherish/python-spider@3c5480d​github.com 首先, ...

  9. 利用python的爬虫技术爬取百度贴吧的帖子

    在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...

最新文章

  1. 整型(int)转时间格式字符串及页面long型转时间格式字符串
  2. 初步解读Golang中的接口相关编写方法
  3. faststone 注册码
  4. RAM的一个实例,向下取整
  5. B站Up主上传质量调优实践
  6. 安装RHEL 7.5 Server版本(RedHat 7.5 Server) 图文教程
  7. 一个农民父亲令人震撼的力量
  8. php session 设置无效
  9. 电商网站交易记录设计
  10. 网络安全之红蓝对抗实战
  11. JavaEE | 语言基础部分、对象与类
  12. 最后期限Lite,兴趣社区圈子论坛小程序前后端
  13. Unity Shader-Ambient Occlusion环境光遮蔽(AO贴图,GPU AO贴图烘焙,SSAO,HBAO)
  14. 《区块链技术原理》笔记
  15. 【转】目前最常见的”无线通信(数据)传输技术“有哪些?
  16. 美团外卖的用户画像怎么设计?用户画像全流程讲解!
  17. 常见问题及解决方法1
  18. Bug: Return value of putIfAbsent is ignored, but list is reused
  19. sei数据格式_【石油化工配管设计规定大全】-48个规范文件-SEI内部资料
  20. 广告和游戏广告变现全面解析

热门文章

  1. HashMap的三种遍历方式
  2. 计算机学院元旦晚会主持词,元旦晚会主持词_2017最新【开场白|节目串词】-太平洋电脑网...
  3. ShowModal 关闭问题
  4. java微服务占用内存过大怎么办
  5. LightsService 灯光控制
  6. html5 生成图片插件,HTML5 canvas生成图片马赛克特效插件
  7. iPhone4s美版港版国行区别!iphone4s哪个版本好?iphone4s版本区别!港行iphone4s siri!香港价格美国价格...
  8. 手机android版本是什么,华为手机为什么有EMUI版本和Android版本?
  9. touchEnd 不执行解决办法
  10. Struts2基本使用