百度贴吧爬虫

项目地址:github

贴吧爬虫。更新后请先删除原有的日志spider.log

2018.6.13更新:新增支持python 3。请卸载原来的python库mysql-python,改为使用mysqlclient

2017.3.23更新:修改了页选项参数形式,增加了只看楼主、只爬精品和自定义过滤帖子功能。

依赖参考

Python >= 2.7 || >= 3.5

mysql >= 5.5

beautifulsoup4 >= 4.6.0

scrapy >= 1.5

mysqlclient >= 1.3.10

使用方法

先打开config.json文件,在其中配置好数据库的域名、用户名和密码。接着直接运行命令即可:

1
scrapy run <贴吧名> <数据库名> <选项>

其中贴吧名不含末尾的“吧”字,而数据库名则是要存入的数据库名字,数据库在爬取前会被创建。例如

1
scrapy run 仙五前修改 Pal5Q_Diy

但若要在控制台输入中文(非ASCII字符),请确保控制台编码为UTF8。

若在config.json里面已经配置好贴吧名和对应数据库名,则可以忽略数据库名。若忽略贴吧名,则爬取config.json里面DEFAULT的数据库。

特别提醒 任务一旦断开,不可继续进行。因此SSH打开任务时,请保证不要断开连接,或者考虑使用后台任务或者screen命令等。

选项说明

短形式长形式参数个数作用举例
-p–pages2设定爬取帖子的开始页和结束页scrapy run … -p 2 5
-g–good_only0只爬精品帖scrapy run … -g
-s–see_lz0只看楼主,即不爬非楼主的楼层scrapy run … -s
-f–filter1设定帖子过滤函数名(见filter.py)scrapy run … -f thread_filter

举例:

1
scrapy run 仙剑五外传 -gs -p 5 12 -f thread_filter

使用只看楼主模式爬仙剑五外传吧精品帖中第5页到第12页的帖子,其中能通过过滤器filter.py中的thread_filter函数的帖子及其内容会被存入数据库。

数据处理

对爬取的数据并非原样入库,会进行一些处理。

  1. 广告楼层会被去掉(右下角有“广告”两字的楼层)。
  2. 加粗和红字效果丢失为纯文本(beautifulsoup的get_text功能)。
  3. 常用表情会转换为文字表达(emotion.json,欢迎补充)。
  4. 图片和视频会变成对应链接(要获取视频链接需要拿到一个302响应)。

数据保存结构

thread

为各帖子的一些基本信息。

属性类型备注
idBIGINT(12)http://tieba.baidu.com/p/4778655068” 的ID就是4778655068
titleVARCHAR(100)
authorVARCHAR(30)
reply_numINT(4)回复数量(含楼中楼, 不含1楼)
goodBOOL是否为精品帖

post

为各楼层的一些基本信息,包括1楼。

属性类型备注
idBIGINT(12)楼层也有对应ID
floorINT(4)楼层编号
authorVARCHAR(30)
contentTEXT楼层内容
timeDATETIME发布时间
comment_numINT(4)楼中楼回复数量
thread_idBIGINT(12)楼层的主体帖子ID,外键

comment

楼中楼的一些信息。

属性类型备注
idBIGINT(12)楼中楼也有ID,且和楼层共用
authorVARCHAR(30)
contentTEXT楼中楼内容
timeDATETIME发布时间
post_idBIGINT(12)楼中楼的主体楼层ID,外键

爬取方式决定了comment有可能先于对应的post被爬取,从而外键错误。因此任务开始阶段数据库的外键检测会被关闭。

耗时参考

耗时和服务器带宽以及爬取时段有关,下面是我的阿里云服务器对几个贴吧的爬取用时,仅供参考。

贴吧名帖子数回复数楼中楼数用时(秒)
pandakill36384122150206222.2
lyingman11290122662126670718.9
仙剑五外传6735612627058074357188

下面几个吧是同一时刻爬取的:

贴吧名帖子数回复数楼中楼数用时(秒)
仙五前修改5303518704579.02
仙剑3高难度20802129316185274.6
古剑高难度17032608632941254.0

特别提醒 请注意下爬取数据的占用空间,别把磁盘占满了。

参考文献

Scrapy 1.0 文档

Scrapy 源代码

Beautiful Soup的用法

Ubuntu/Debian 安装lxml的正确方式

Twisted adbapi 源代码

mysql升级8.0后遇到的坑

有什么问题或建议欢迎到下方留言~