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

一、效果如下:

二、运行环境:

        win10系统;python3;PyCharm

三、QQ机器人用的是qqbot模块

        用pip安装命令是: pip install qqbot (前提需要有requests库)

        实现自己的机器人:网上好几种写法,很简单,不过有时候环境不同会出现错误,下面是亲测可以运行的:

        from qqbot import QQBotSlot as qqbotslot, RunBot

         @qqbotslot

         def onQQMessage(bot, contact, member, content):

       if content == "-hello":#content是好友发的信息
bot.SendTo(contact,"我是,QQ机器人")
if __name__ == "__main__":
RunBot()
四、爬取百度文库
需要模块:import urllib.request,urllib,re
获取原网页代码:
提前说下百度文库网页编码是gb2312
def baidu(self,world):
        data={}
data['word'] = world
url_World=urllib.parse.urlencode(data,encoding="GBK")
url = "https://wenku.baidu.com/search?"+url_World+"&org=0&ie=gbk"
page = urllib.request.urlopen(url)
html = page.read()
html = html.decode('gbk')
代码解析:
data['word'] = world #world是搜索的内容,也就是关键词
url不必多说就是网页链接
但是二者之间多了一行代码:url_World=urllib.parse.urlencode(data,encoding="GBK")
看一下百度文库搜索"大学":https://wenku.baidu.com/search?word=%B4%F3%D1%A7&org=0&ie=gbk
其中%B4%F3%D1%A7 就是"大学"的十六进制。
也就是说我们想搜索“大学”的相关内容需要把“大学”的中文转成上面格式,如果不转会出现什么状况
我们直接把中文“大学”塞到链接里去访问: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格式的。
不过默认的编码是utf-8,直接把data放进去会按照utf-8进行转的话会得到如下链接:
https://wenku.baidu.com/search?word=%E5%A4%A7%E5%AD%A6&org=0&ie=gbk
此链接得到网页效果是和之前把中文放进链接效果一样
网上找到的基本上都是这样的写法,不过百度文库是采用gb2312编码所以需要在那行转码代码中再添加一个编码参数就能够达到目的
如下:urllib.parse.urlencode(data,encoding="GBK")
这样无论是url转码还是后面的解码都会正常运行了。
此过程就能够得到正常的搜索结果的原网页了
用正则获取想要的信息:

上面代码就能把需要的是标题和相应的链接给提取出来
其他的就是容错问题了。
全部代码如下:
from qqbot import QQBotSlot as qqbotslot, RunBot
import urllib.request,urllib,re
class pyth(object):
    def baidu(self,world):
        data={}
        data['word'] = world
        url_World=urllib.parse.urlencode(data,encoding="GBK")
        url = "https://wenku.baidu.com/search?"+url_World+"&org=0&ie=gbk"
        page = urllib.request.urlopen(url)
        html = page.read()
        html = html.decode('gbk')
        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)
        pri = "百度文库搜索结果:"
        if len(title1)>2:
            for i in range(2):
                pri += "\n"+title1[i]+"\n链接:"+url11[i];
        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()

 


 



 



posted @ 2018-02-27 20:47  琳嘉  阅读(1382)  评论(0编辑  收藏  举报