百度贴吧爬虫

项目地址: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 –pages 2 设定爬取帖子的开始页和结束页 scrapy run … -p 2 5
-g –good_only 0 只爬精品帖 scrapy run … -g
-s –see_lz 0 只看楼主,即不爬非楼主的楼层 scrapy run … -s
-f –filter 1 设定帖子过滤函数名(见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

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

属性 类型 备注
id BIGINT(12) http://tieba.baidu.com/p/4778655068” 的ID就是4778655068
title VARCHAR(100)
author VARCHAR(30)
reply_num INT(4) 回复数量(含楼中楼, 不含1楼)
good BOOL 是否为精品帖

post

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

属性 类型 备注
id BIGINT(12) 楼层也有对应ID
floor INT(4) 楼层编号
author VARCHAR(30)
content TEXT 楼层内容
time DATETIME 发布时间
comment_num INT(4) 楼中楼回复数量
thread_id BIGINT(12) 楼层的主体帖子ID,外键

comment

楼中楼的一些信息。

属性 类型 备注
id BIGINT(12) 楼中楼也有ID,且和楼层共用
author VARCHAR(30)
content TEXT 楼中楼内容
time DATETIME 发布时间
post_id BIGINT(12) 楼中楼的主体楼层ID,外键

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

耗时参考

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

贴吧名 帖子数 回复数 楼中楼数 用时(秒)
pandakill 3638 41221 50206 222.2
lyingman 11290 122662 126670 718.9
仙剑五外传 67356 1262705 807435 7188

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

贴吧名 帖子数 回复数 楼中楼数 用时(秒)
仙五前修改 530 3518 7045 79.02
仙剑3高难度 2080 21293 16185 274.6
古剑高难度 1703 26086 32941 254.0

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

参考文献

Scrapy 1.0 文档

Scrapy 源代码

Beautiful Soup的用法

Ubuntu/Debian 安装lxml的正确方式

Twisted adbapi 源代码

mysql升级8.0后遇到的坑

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