Skip to content
百度贴吧爬虫(基于scrapy和mysql)
Branch: master
Clone or download
Latest commit e47b897 May 10, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
tieba fix #6 Sep 2, 2018
.gitignore compatible for py3 Jun 13, 2018
README.md Update README.md May 10, 2019
README_en.md compatible for py3 Jun 13, 2018
config.json compatible for py3 Jun 13, 2018
config.py compatible for py3 Jun 13, 2018
emotion.json compatible for py3 Jun 13, 2018
filter.py 2st edition Mar 23, 2017
scrapy.cfg first_commit Jan 15, 2017

README.md

Tieba_Spider

Readme(EN)

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

注:根据issue 9只会爬取楼中楼的第一页(目前为前10条回复)。暂无修正计划。

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文件,在其中配置好数据库的域名、用户名和密码。接着直接运行命令即可:

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

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

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

举例:

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后遇到的坑

有什么问题或建议欢迎到我的主页留言~

You can’t perform that action at this time.