Python爬虫实现百度贴吧文本爬取【每天近千万级数据量】
一、概述
我先澄清一下,我并不是单纯的为了爬数据而爬数据,这其实是为了之后的语音识别的语言模型训练积累数据的,所以我就实现了一个这样的爬虫,它可以不断的爬取各个指定贴吧的帖子文本内容,并把它存入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.
源码使用方法
- 下载源码后,首先进入BaiduTieBa\utils\config.py配置文件,将其中的MongoDB参数改为你自己主机的参数。
# MongoDB的参数
MONGO_URL = 'localhost'
MONGO_DB = 'TieBa'
MONGO_TABLE = 'TieBa'
- 然后进入BaiduTieBa\utils\args.py文件,其实也是一个配置文件,修改其中的TIEBA,可以在其中放入你想要爬取的贴吧关键词。
注意:不要删除列表中元素或对其改变顺序,因为log文件是和其一一对应的,改变之后会使爬取的页面混乱,出现漏爬数据或重复数据的情况。
# 待爬取的贴吧
TIEBA = ['李毅', 'nba', '娱乐', '新闻']
- 将以上两项都修改完毕之后,这里可能需要你有一点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('所有子进程爬取完成.')
- 最后一步,如果BaiduTieBa\log目录中有日志文件的话,要进行清理,因为这里面存储的使我以前爬取过的一些贴吧,可能我发的时候没有清理,orz。
- 然后你就可以快乐的爬取啦!直接运行BaiduTieBa\run.py文件即可(友善提醒:记得开启MongoDB服务以及关闭你的VPN)。
源码
源代码请自行去我的github上下载:
https://github.com/AndroidStudio2017/BaiduSpider
如有问题,欢迎留言!
Python爬虫实现百度贴吧文本爬取【每天近千万级数据量】相关推荐
- python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...
原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...
- 基于python爬虫————静态页面和动态页面爬取
基于python爬虫----静态页面和动态页面爬取 文章目录 基于python爬虫----静态页面和动态页面爬取 1. 爬虫的原理 2. 用正则表达式匹配获取数据 3. 页面源码解析 4. 通过req ...
- Python爬虫《自动化学报》数据爬取与数据分析
Python爬虫<自动化学报>数据爬取与数据分析 文章目录 Python爬虫<自动化学报>数据爬取与数据分析 前言 一.代码 二.结果展示 三.爬虫实现 1.准备 2.获取网页 ...
- Python爬虫系列(二):爬取中国大学排名丁香园-用户名和回复内容淘宝品比价
Python爬虫系列(二):爬取中国大学排名&丁香园-用户名和回复内容&淘宝品比价 目录 Python爬虫系列(二):爬取中国大学排名&丁香园-用户名和回复内容&淘宝品 ...
- python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...
Python爬虫入门实战--------一周天气预报爬取[转载][没有分析 Python爬虫入门实战--------一周天气预报爬取[转载][没有分析] 来源:https://blog.csdn.ne ...
- Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息
Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息 基础: Python 爬虫 之 Selenium.webdriver 的安装,以及模拟打开操作 ...
- Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影
文章目录 前言 安装bs4库 网站分析 获取页面 爬取页面 页面分析 其他页面 爬虫系列 前言 经过上篇博客Python爬虫小白教程(一)-- 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在 ...
- Python爬虫学习基础——5分钟学会爬取B站视频日播放量排行
Python爬虫学习基础--5分钟学会爬取B站视频日播放量排行 基础包含 requests pyquery 进入正题 基础包含 这也是我当初第一次学习爬虫时做的练习,感觉给初学者练笔挺不错的.运用的知 ...
- python爬虫(一):正则表达式爬取网页文本
文章目录 1 正则表达式 2 网页文本爬取 2.1 单页文本 2.2 多页文本 2.2.1 演示文本 2.2.2 文本信息获取 3 实战记录 3.1 网页纯文本处理 3.1.1 常规网页 3.1.2 ...
最新文章
- 2498-R06 SFP与线缆的选择与配置
- linux下的各种系统错误errno描述一览
- 前端技术分享:Nginx负载均衡视频,基础的实战应用
- Class_fileAndroid应用调用方法
- python如何只保留数字_如何查询刷卡消费有没有积分?只需用4个数字马上能查...
- 【FLink】Flink 1.9 升级到 1.12.4 无配置页面 无日志
- windows内置的linux安卓驱动多系统摆脱虚拟机(上)
- windows API 菜鸟学习之路(三)
- linux中id命令的功能,Linux id命令参数及用法详解
- TP5常用命令符操作
- 基于Jquery WeUI的微信开发H5页面控件的经验总结(2)
- python进行图像的风格转换
- Edge、Chrome自定义新标签页网址
- 计算机应用技术 快捷键,几个实用的电脑使用技巧和快捷键
- 导出https网站证书
- TopCoder 介绍
- 【机器学习的数学基础】(二)线性代数(Linear Algebra)(中)
- ps 中取消网格线的吸附功能,其实是对齐功能
- 系统缺少steam_api.dll解决方式
- Shrio异常The security manager does not implement the WebSecurityManager interface.
热门文章
- 第三届软件测试火焰杯比赛开启,可以报名啦!
- oracle的分析函数over 及开窗函数
- 26MHz热敏晶振专注高端智能电子产品市场
- 为什么自由空间损耗公式中dbm可以减去db
- 回顾2017系列篇(三):UX设计大会,都预示了哪些设计趋势?
- 这70个Java必背英语单词不会_英语不好没关系,背过这70个单词学java足够了!
- IT龙门阵73期总结:移动Widget闪亮未来
- 【i.MX6ULL】驱动开发2——新字符设备开发模板
- 成都精灵云C++ 一面(20min)
- 鼠标键盘与计算机无法连接,只有三个步骤可以轻松解决无法识别计算机,键盘和鼠标的问题!...