一、概述

我先澄清一下,我并不是单纯的为了爬数据而爬数据,这其实是为了之后的语音识别的语言模型训练积累数据的,所以我就实现了一个这样的爬虫,它可以不断的爬取各个指定贴吧的帖子文本内容,并把它存入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 += 1p.join()print('所有子进程爬取完成.')
  1. 最后一步,如果BaiduTieBa\log目录中有日志文件的话,要进行清理,因为这里面存储的使我以前爬取过的一些贴吧,可能我发的时候没有清理,orz。
  2. 然后你就可以快乐的爬取啦!直接运行BaiduTieBa\run.py文件即可(友善提醒:记得开启MongoDB服务以及关闭你的VPN)。

源码

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

如有问题,欢迎留言!

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

  1. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

    原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...

  2. 基于python爬虫————静态页面和动态页面爬取

    基于python爬虫----静态页面和动态页面爬取 文章目录 基于python爬虫----静态页面和动态页面爬取 1. 爬虫的原理 2. 用正则表达式匹配获取数据 3. 页面源码解析 4. 通过req ...

  3. Python爬虫《自动化学报》数据爬取与数据分析

    Python爬虫<自动化学报>数据爬取与数据分析 文章目录 Python爬虫<自动化学报>数据爬取与数据分析 前言 一.代码 二.结果展示 三.爬虫实现 1.准备 2.获取网页 ...

  4. Python爬虫系列(二):爬取中国大学排名丁香园-用户名和回复内容淘宝品比价

    Python爬虫系列(二):爬取中国大学排名&丁香园-用户名和回复内容&淘宝品比价 目录 Python爬虫系列(二):爬取中国大学排名&丁香园-用户名和回复内容&淘宝品 ...

  5. python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...

    Python爬虫入门实战--------一周天气预报爬取[转载][没有分析 Python爬虫入门实战--------一周天气预报爬取[转载][没有分析] 来源:https://blog.csdn.ne ...

  6. Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

    Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息 基础: Python 爬虫 之 Selenium.webdriver 的安装,以及模拟打开操作 ...

  7. Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影

    文章目录 前言 安装bs4库 网站分析 获取页面 爬取页面 页面分析 其他页面 爬虫系列 前言 经过上篇博客Python爬虫小白教程(一)-- 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在 ...

  8. Python爬虫学习基础——5分钟学会爬取B站视频日播放量排行

    Python爬虫学习基础--5分钟学会爬取B站视频日播放量排行 基础包含 requests pyquery 进入正题 基础包含 这也是我当初第一次学习爬虫时做的练习,感觉给初学者练笔挺不错的.运用的知 ...

  9. python爬虫(一):正则表达式爬取网页文本

    文章目录 1 正则表达式 2 网页文本爬取 2.1 单页文本 2.2 多页文本 2.2.1 演示文本 2.2.2 文本信息获取 3 实战记录 3.1 网页纯文本处理 3.1.1 常规网页 3.1.2 ...

最新文章

  1. 2498-R06 SFP与线缆的选择与配置
  2. linux下的各种系统错误errno描述一览
  3. 前端技术分享:Nginx负载均衡视频,基础的实战应用
  4. Class_fileAndroid应用调用方法
  5. python如何只保留数字_如何查询刷卡消费有没有积分?只需用4个数字马上能查...
  6. 【FLink】Flink 1.9 升级到 1.12.4 无配置页面 无日志
  7. windows内置的linux安卓驱动多系统摆脱虚拟机(上)
  8. windows API 菜鸟学习之路(三)
  9. linux中id命令的功能,Linux id命令参数及用法详解
  10. TP5常用命令符操作
  11. 基于Jquery WeUI的微信开发H5页面控件的经验总结(2)
  12. python进行图像的风格转换
  13. Edge、Chrome自定义新标签页网址
  14. 计算机应用技术 快捷键,几个实用的电脑使用技巧和快捷键
  15. 导出https网站证书
  16. TopCoder 介绍
  17. 【机器学习的数学基础】(二)线性代数(Linear Algebra)(中)
  18. ps 中取消网格线的吸附功能,其实是对齐功能
  19. 系统缺少steam_api.dll解决方式
  20. Shrio异常The security manager does not implement the WebSecurityManager interface.

热门文章

  1. 第三届软件测试火焰杯比赛开启,可以报名啦!
  2. oracle的分析函数over 及开窗函数
  3. 26MHz热敏晶振专注高端智能电子产品市场
  4. 为什么自由空间损耗公式中dbm可以减去db
  5. 回顾2017系列篇(三):UX设计大会,都预示了哪些设计趋势?
  6. 这70个Java必背英语单词不会_英语不好没关系,背过这70个单词学java足够了!
  7. IT龙门阵73期总结:移动Widget闪亮未来
  8. 【i.MX6ULL】驱动开发2——新字符设备开发模板
  9. 成都精灵云C++ 一面(20min)
  10. 鼠标键盘与计算机无法连接,只有三个步骤可以轻松解决无法识别计算机,键盘和鼠标的问题!...