Python爬虫实现百度贴吧文本爬取【每天近千万级数据量】

版权声明:Johnson https://blog.csdn.net/m0_38055352/article/details/84405081

一、概述

      我先澄清一下,我并不是单纯的为了爬数据而爬数据,这其实是为了之后的语音识别的语言模型训练积累数据的,所以我就实现了一个这样的爬虫,它可以不断的爬取各个指定贴吧的帖子文本内容,并把它存入MongoDB,而且可以自己根据电脑的配置和MongoDB的极限指定允许并发的线程数,我在我的电脑上使用的是4个线程,已经可以达到每日近千万级的数据量。

二、实现思路

      首先先声明一下我在此次工程实现的过程中所用到的库,如果有没有这些库的同学自行安装,安装过程在网上都有,这里就不提供了。

  • MongoDB数据库 (对应python中pymongo库)
  • BeautifulSoup解析库 (用于解析网页html)

额外的库应该就这两个了,其他类似urllib、requests等库都是python自带的。如果再有我没有发现的,就自行解决一下哈。
索引页的获取
      然后就考虑要怎么实现这样一个爬虫,首先我们以百度第一大吧为例,百度搜索’李毅吧’,进入此贴吧的索引页,也就是这个页面.
在这里插入图片描述
然后,作为一个会编写爬虫的程序员,F12一定是一个必不可少的快捷键,打开开发者工具,选中NetWork选项卡,刷新一下页面,你会在左侧看到一个有些高亮的一个条目,这也就是当前页面了,点击它,查看网页的Headers,你会发现这就是一个get请求,进一步查看其参数,也就是Query String Parameters,右下角
在这里插入图片描述
发现其只有kw、ie和pn这三个参数,kw是你搜索贴吧的关键词,pn是页数,这里要注意,这个页数并不是按自然数增加的,而是1,50,100,150 …,当然只要是有规律的,我们就能爬!但是我们还要考虑一个问题,就是他的页数是有上限的,要是不考虑这个问题单纯的让页数一直增加的话,最后就只能爬取到403错误了。
      那这个问题要怎么解决呢?我们当然还是从html代码中找资源,好像代码中没有提供页数呀?真的吗?你再仔细看看?看每个索引页的最下面,你会发现这样一些数字.
在这里插入图片描述
它虽然没有提供总的页数,但是提供的总的帖子数,有了这个,而且你也可以知道每一页有多少贴子,这样的话,也就一个简单的触发就可以解决啦!是不是很机智?
      再之后的操作就是用requests去get,然后再用BeautifulSoup去解析了,如何进行文字的匹配我就不细说了,具体可以参看我的源代码,无非也就是用正则表达式还有BeautifulSoup自带的库函数进行处理。
详情页的获取
      接下来就是详情页的获取了,根据以上步骤获得索引页之后,再进行简单的匹配,就可以获得每一个详情页的链接了,对于详情页,其实相对来说就更简单了,只需要进行文本匹配然后再将其存入数据库即可,但还有一个需要解决的问题,就是翻页的问题。
      有了爬取索引页的经验,再来看详情页,这里就很好啦,同样的位置,它直接提供了页数,那,我们就不客气的直接拿过来用就好了,其它的过程也都是和详情页是一致的。
日志文件的建立
      我们还要考虑一个问题,当你今天爬完数据之后,开开心心的关上电脑睡觉去了,第二天你又开启了爬虫,想让它继续爬取,但它怎么知道它昨天爬到了哪里呢?所以又从头开始爬,这样你今天一天,又爬了一千万条同样的数据,是不是很难受?
      这里就体现了日志的作用,我们可以在爬取完一页,或一个链接之后写一条记录,记录一下当前爬取到的地方,然后再次爬取的时候,直接读取日志文件的最后一行,就可以继续昨天的任务啦!

三、总结以及源代码的使用方法

一个简短的总结
      其实这就完成了一个每日近千万级的数据的爬取,是不是有人觉得太简单了?其实我之前尝试过对于新浪微博和腾讯新闻的爬取,那个可就比这个复杂多了,什么验证码啊,什么IP池、Cookies池呀,各种繁琐的反爬技巧,但我最后发现爬取出来也并没有什么太大的实际性收益,还不如就找这种开放的文本数据,既可以满足我的机器学习需求,实现起来也比较简单,何乐而不为呢?
      其实这里我想说的就是,大家对于技术不要追求复杂、高超,实用就好,当然如果有人有对那些复杂网站爬取的需求可以给我留言,我后续可能也会继续更新那些相关的爬取教程,但如果没人需要的话,我后面可能更多的是一些语音识别学习的博文了,因为毕竟那个才是目的,才是坑orz.
源码使用方法

  1. 下载源码后,首先进入BaiduTieBa\utils\config.py配置文件,将其中的MongoDB参数改为你自己主机的参数。
# MongoDB的参数
MONGO_URL = 'localhost'
MONGO_DB = 'TieBa'
MONGO_TABLE = 'TieBa'
  1. 然后进入BaiduTieBa\utils\args.py文件,其实也是一个配置文件,修改其中的TIEBA,可以在其中放入你想要爬取的贴吧关键词。
    注意:不要删除列表中元素或对其改变顺序,因为log文件是和其一一对应的,改变之后会使爬取的页面混乱,出现漏爬数据或重复数据的情况。
# 待爬取的贴吧
TIEBA = ['李毅', 'nba', '娱乐', '新闻']
  1. 将以上两项都修改完毕之后,这里可能需要你有一点python切片的知识了,进入BaiduTieBa\run.py运行文件,将id进行修改,这样就可以爬取你TIEBA列表中第id个关键词后面的所有关键词(注意这里是并行爬取,所以注意数量),当然如果有特殊需要可以直接修改TIEBA[id:]中中括号里的切片,把它改成你需要的。
def main():
    print('开始爬取指定的贴吧...')
    id = 18     # 修改此可爬取list对应的id之后的关键词
    for item in TIEBA[id:]:
        p = Process(target=One_Process, args=(item, id))
        p.start()
        id += 1
    p.join()
    print('所有子进程爬取完成.')
  1. 最后一步,如果BaiduTieBa\log目录中有日志文件的话,要进行清理,因为这里面存储的使我以前爬取过的一些贴吧,可能我发的时候没有清理,orz。
  2. 然后你就可以快乐的爬取啦!直接运行BaiduTieBa\run.py文件即可(友善提醒:记得开启MongoDB服务以及关闭你的VPN)。

源码

源代码请自行去我的github上下载:
https://github.com/AndroidStudio2017/BaiduSpider

如有问题,欢迎留言!

猜你喜欢

转载自blog.csdn.net/m0_38055352/article/details/84405081
今日推荐