python生成QQ机器人爬取百度文库链接推送好友并生成词云
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机器人爬取百度文库链接推送好友并生成词云相关推荐
- 使用python中的Selenium爬取百度文库word文章
参考文章:Python3网络爬虫(九):使用Selenium爬取百度文库word文章,链接为: https://blog.csdn.net/c406495762/article/details/723 ...
- python爬取qq好友_Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)...
一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有request ...
- python 爬虫——爬取百度文库VIP内容
转载自:爬取百度文库 代码实现 import requests import re import json import ossession = requests.session()def fetch ...
- 写一个爬虫,可以爬取百度文库内容
爬取百度文库内容需要使用爬虫技术.以下是一个简单的 Python 爬虫示例: import requestsurl ="https://wenku.baidu.com/view/your_d ...
- 使用python和PyQt5编写爬取百度图片的界面工具
使用python和PyQt5编写爬取百度图片的界面工具 本篇文章的主要内容是展示我个人编写的,以界面小工具的方式爬取百度上面的图片,功能很单一,根据关键词爬取图片,代码很简单,新手上路请多指教. 代码 ...
- Python爬虫实战之爬取百度贴吧帖子
Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...
- python爬取百度文库doc_Python百度文库爬虫之doc文件
Python百度文库爬虫之doc文件 说明:此文件是在爬取txt文件下的基础进行的,因此重复内容会一笔带过,不懂请看前面爬取txt文件链接 对于文件的所有类型,我都会用一篇文章进行说明,链接: 一.网 ...
- go爬取json_Python爬取百度文库学习
首先先分享下github这篇文章吧,参考了部分代码,但我想做一个很详细的解读. 新版百度文库爬虫 · Jack-Cherish/python-spider@3c5480dgithub.com 首先, ...
- 利用python的爬虫技术爬取百度贴吧的帖子
在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...
最新文章
- 整型(int)转时间格式字符串及页面long型转时间格式字符串
- 初步解读Golang中的接口相关编写方法
- faststone 注册码
- RAM的一个实例,向下取整
- B站Up主上传质量调优实践
- 安装RHEL 7.5 Server版本(RedHat 7.5 Server) 图文教程
- 一个农民父亲令人震撼的力量
- php session 设置无效
- 电商网站交易记录设计
- 网络安全之红蓝对抗实战
- JavaEE | 语言基础部分、对象与类
- 最后期限Lite,兴趣社区圈子论坛小程序前后端
- Unity Shader-Ambient Occlusion环境光遮蔽(AO贴图,GPU AO贴图烘焙,SSAO,HBAO)
- 《区块链技术原理》笔记
- 【转】目前最常见的”无线通信(数据)传输技术“有哪些?
- 美团外卖的用户画像怎么设计?用户画像全流程讲解!
- 常见问题及解决方法1
- Bug: Return value of putIfAbsent is ignored, but list is reused
- sei数据格式_【石油化工配管设计规定大全】-48个规范文件-SEI内部资料
- 广告和游戏广告变现全面解析
热门文章
- HashMap的三种遍历方式
- 计算机学院元旦晚会主持词,元旦晚会主持词_2017最新【开场白|节目串词】-太平洋电脑网...
- ShowModal 关闭问题
- java微服务占用内存过大怎么办
- LightsService 灯光控制
- html5 生成图片插件,HTML5 canvas生成图片马赛克特效插件
- iPhone4s美版港版国行区别!iphone4s哪个版本好?iphone4s版本区别!港行iphone4s siri!香港价格美国价格...
- 手机android版本是什么,华为手机为什么有EMUI版本和Android版本?
- touchEnd 不执行解决办法
- Struts2基本使用