Python3实现百度贴吧帖子搜索

一、前言

由于实习公司市场营销部前置营销的需要,给我们布置了在百度贴吧检索特定帖子的任务。考虑到一页一页人工搜索效率低,于是打算用爬虫实现一个帖子检索器,并把相关内容保存下来。


二、配置环境

之前使用机器学习的时候,一直是在Ubuntu虚拟机上运行,而这次需要在Windows上运行,所以重新配置了一波环境。

1. Python3.5安装

首先,在Python下载网站下载需要的Python,需要注意的是,下载的Python版本位数和系统位数无关,即64位操作系统也可以使用32位的Python。在安装时,注意下方Add to Path选项的勾勾需要选中,这样就不需要手动添加路径了。如果该方法添加失败,可以采用手动添加路径的方法。

1.1 鼠标右键点击计算机,选择“属性”-“高级系统设置”

设置

1.2 依次选择“环境变量”-“PATH”-新建,将Python安装路径添加进去即可,切记:路径一定要以;(分号,英文半角)结尾!

添加环境变量

1.3 测试Python是否安装成功,可以在cmd下输入Python,如果如下图所示,则证明安装成功。

py安装成功

1.4 注意,在win10下启动cmd有两种方法:
  - 方法1: win+R -> 输入cmd 
  - 方法2: 右键点击开始菜单,选择“命令提示符”

个人推荐方法1。

2. 相关库的安装

2.1 pip安装

由于pip是安装其他库的基础,所以需要首先进行安装。

具体方法如下

  • 点击pip下载链接,下载pip压缩文件(选择图中红框标注的进行下载)。

pip下载

  • 将该压缩包解压到Python目录下,并在cmd中将路径调整到pip解压目录下,运行python setup.py install即可。
  • 不知道如何在cmd中切换路径的请猛戳cmd切换盘符链接

  • 安装完成后在cmd中输入pip,检查是否安装成功。

2.2 BeautifulSoup 安装

BeautifulSoup(bs4)是为了写爬虫而特别安装的一个库,这个库解决了我在从网页中获取数据时编码不正确的问题,虽然执行起来效率低了些,但至少能执行了。

在我们安装好了pip之后,安装bs4就是水到渠成的事情啦,直接cmd下输入pip install beautifulsoup4即可。

之前说到,这个库的安装解决了编码的问题。具体而言是我在使用python自带的urllib库取数据时,使用print(response.read().decode(‘utf-8’))和print(response.read().decode(‘gbk’))甚至print(response.read().decode(‘iso-8859-15’))都没能成功输出,所以最后采用bs4库的lxml完成。

2.3 lxml库安装

这个库的安装也是有百度教程的,我直接使用了pip install lxml安装成功。如果安装不成功,可以参考该百度教程。

2.4 requests库安装

直接cmd下输入pip3 install requests,OK。

2.5 pyinstaller安装

安装这个软件的目的是将最后生成的.py文件转换为.exe文件,可以直接在windows下执行,毕竟我们的目的如此。

该软件安装也有两种方法可选,这两种方法我都尝试了一下。

第一次采用的是官网上提供的:pip install pyinstaller,使用条件是要有较好的网速,否则安装过程中就会报错(貌似是超时错误)。

第二次是先将压缩包下载下来,然后和pip方法类似,也是解压,然后cmd下输入python setup.py install

当然,安装过程中还有可能报错,这里报错的原因是缺失pywin32库,去这里下载你需要的文件,注意此时系统位数软件位数需要一致!

到这里,所需要的库基本上已经安装完毕,接下来就可以着手写爬虫啦。

3. 程序编写

程序的编写,我主要参考了两个人的博客,但是由于太过仓促,没有记下来他们的博客链接,在此表示歉意。

接下来,说一下具体思路。我们的目的是从某一百度贴吧内,搜索标题包含指定内容的帖子,并将该帖子的标题和内容保存下来,这样才能起到快速检索的目的。因此,我们首先要做的是,贴吧某一页下所有的内容。这里,我们可以采用bs4库的函数直接提取,具体代码如下:

    # 初始化
    def __init__(self, baseUrl, schoolName, schoolnameChinese):
        # 转码为url可以读取的字符串
        self.schoolName = urllib.parse.quote(schoolName)
        self.baseUrl = baseUrl
        self.schoolnameChinese = schoolName
# 得到真正的url
url = self.baseUrl + self.schoolName + '&ie=utf-8&pn=' + str(pageNum*50)
# 打开该网址
html = urlopen(url)
bsObj = bsObj = BeautifulSoup(html,"lxml")    #将html对象转化为BeautifulSoup对象  

其中,代码urllib.parse.quote(schoolName)是将中文输入的学校名(或者是你想搜索的任意一个贴吧名称)转换为url可以识别的形式。

另外一行代码:

url = self.baseUrl + self.schoolName + '&ie=utf-8&pn=' + str(pageNum*50)

则需要通过解析百度贴吧网址规律搞清楚。

首先,百度贴吧的网址目前(以后可能会改动)形如:

https://tieba.baidu.com/f?kw=%E8%B6%B3%E7%90%83&ie=utf-8&pn=50

该网址可以分为3部分,第一部分为:

 https://tieba.baidu.com/f?kw=

可以看成是固定部分,也就是我们上述代码中的self.baseUrl,这部分内容是可以预先设定好的。

接下来,第二部分为:

%E8%B6%B3%E7%90%83

这个是我们所输入汉字的16进制编码,有兴趣的可以解码一下,看看我输入的究竟是什么。而对应到代码中,则是self.schoolName

最后一部分用来表示页码,即百度贴吧的第几页。注意到一页包含50条帖子,因此页码是以50的倍数形式出现,即[0,50,100,…,50n]。注意到这一点,我们就可以将最后的部分写为str(pageNum*50)。其中,str用于将数字转为字符串。

OK,有了提取出某一页码下的内容,接下来,我们就要去提取标题了。这里,需要大家学会一个小技巧-【如何在网页中查找特定内容】。

万恶的2M限制,让我删了很多帧

然后,就是找规律啦,对照着代码看看,如何提取标题和特定内容,并且完成保存。

liList = bsObj.find_all("a",class_="j_th_tit ")
for item in liList:
    # 获取链接网址
    href = item.get('href')
    hrefUrl = 'tieba.baidu.com' + href
    # 获取标题信息
    name = item.get('title')
    # 判断该标题是否满足我们的判决条件
    match = re.search("你",name) or re.search("我",name) or re.search("他",name) or re.search("她", name) or re.search("它", name) or re.search("我们", name)     # 可修改和补充关键字(你,我,他。。。)
    print(match)
    # 如果满足,则保存到txt中
    if match:
        targets = [hrefUrl, name]
        # txt的命名,我采用的是“学校名+.txt”的形式,但是很糟糕的是,“学校名”只能以16进制字符串的形式输入,试了各种编码解码,均无能为力,期待大神解答!
        with open(self.schoolName+'.txt', 'a+') as f:
            # 保存格式为“学校:...\n 标题:...\n (链接)网址:...\n”
            f.write("学校:"+str(self.schoolnameChinese)+"\n"+"标题:"+str(targets[1])+"\t"+"网址:"+str(targets[0])+"\n")

# print(liList)
return liList

4. 打包为.exe

考虑到大部分windows电脑不可能配置python环境,我们需要把程序打包成.exe才可以执行。这里,我用到了Pyinstaller软件进行打包。

具体教程可以参照这里Pyinstaller使用

这里,我想补充的是大家在-p添加完路径后仍然报错的情况。报错:No module named ‘queue’。

尝试了很多方法,包括在py文件中添加各种库,均无法解决。最后,又要感谢csdn,我在这里找到了答案:我是传送门

直接在打包命令中添加如下代码:--hidden-import=queue。具体原因不明。。。

打包指令

打包指令图给大家放一张,路径很长,需要大家在cmd下这样查找:

python(回车->进入python界面)

import sys
print(sys.path)

最后,愉快的生成了如下.exe,大功告成!

程序

5. 源码下载

源码已经上传git,需要的话自行下载啦:我是传送门,点我点我

6. 总结与展望

程序执行效率低,可能是使用了第三方库的原因,而且纯暴力处理,没有一丝算法的影子。。。

另外,程序还有很多可以改进的地方,比如把机器学习的东西加进去,使其不再局限于关键字检索,而是关键字相关检索。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值