QQ空间(⽇志、说说、个⼈信息)python爬⾍源码(⼀天可抓取400万条数
据)
本⽂代码github地址:
回复 datadw 关键词“QQ”获取。
爬⾍功能:
QQSpider 使⽤⼴度优先策略爬取QQ空间中的个⼈信息、⽇志、说说、好友四个⽅⾯的信息。
判重使⽤“内存位”判重,理论上亿数量级的QQ可瞬间判重,内存只占⽤400M+。
爬⾍速度可达到单机每天400万条数据以上(具体要考虑⽹速、⽹络带宽、稳定性等原因。我在学校是400万+,但在公司那边却只有六成的速度,普通家庭⽹络可能会更慢)。
环境、架构:
开发语⾔:Python2.7
开发环境:64位Windows8系统,4G内存,i7-3612QM处理器。
数据库:MongoDB 3.2.0
(Python编辑器:Pycharm 5.0.4;MongoDB管理⼯具:MongoBooster 1.1.1)
主要使⽤ requests 模块抓取,部分使⽤ BeautifulSoup 解析。
多线程使⽤ multiprocessing.dummy 。
抓取 Cookie 使⽤ selenium 和 PhantomJS 。
判重使⽤ BitVector 。
使⽤说明:
启动前配置:
1.
需要安装的软件:python、Redis、MongoDB(Redis和MongoDB都是NoSQL,服务启动后能连接上就⾏,不需要建表什么的)。
2.
需要安装的Python模块:requests、BeautifulSoup、multiprocessing、selenium、itertools、redis、pymongo。
3.
启动程序:
1.
进⼊ 写⼊QQ账号和密码(不同QQ换⾏输⼊,账号密码空格隔开)。如果你只是测试⼀下,则放三两个QQ⾜矣;但如果你开多线程⼤规模抓取的话就要⽤多⼀点QQ号(thread_num_QQ的2~10倍),账号少容易被检测为异常⾏为。
为异常⾏为。
2.
进⼊ init_messages.py 进⾏爬⾍参数的配置,例如线程数量的多少、设置爬哪个时间段的⽇志,哪个时间段的说说,爬多少个说说备份⼀次等等。
3.
运⾏ launch.py 启动爬⾍。
4.爬⾍开始之后⾸先根据 ⾥⾯的QQ去获取 Cookie(以后登录的时候直接⽤已有的Cookie,就不需要每次都去拿Cookie了,遇到Cookie失效也会⾃动作相应的处理)。获取完Cookie后爬⾍程序会去申请四百多兆的内存,申请的时候会占⽤两G左右的内存,⼤约五秒能完成申请,之后会掉回四百多M。
5.爬⾍程序可以中途停⽌,下次可打开继续抓取。
运⾏截图:
代码说明:
1.
mongodb⽤来存放数据,redis⽤来存放待爬QQ和Cookie。
2.
爬⾍之前使⽤的是BitVector去重,有⼀部分⼈反映经常会报错,所以现在使⽤基于Redis的位去重,内存占⽤不超过512M,能容纳45亿个QQ号瞬间去重,⽽且⽅便分布式扩展。
3.
爬⾍使⽤phantomJS模拟登陆QQ空间,有时候会出现验证码。我使⽤的是云打码(⾃⾏百度),准确率还是⾮常⾼的,QQ验证码是4位纯英⽂,5元可以识别1000个验证码。如果需要请⾃⾏去注册购买,将账号、密码、appkey填⼊ yundama.py,再将 public_methods.py ⾥的dama=False改成dama=True即可。
4.
分布式。现在已经将种⼦队列和去重队列都放在了Redis上⾯,如果需要⼏台机器同时爬,只需要将代码复制⼀份到另外⼀台机⼦,将连Redis时的localhost改成同⼀台机器的IP即可。如果想要将爬下来的数据保存到同⼀台机,也只需要将连MongoDB时的localhost改成该机器的IP即可。
5.
为了让程序不那么复杂难懂,此项⽬只⽤了多线程,即只⽤到了⼀个CPU。如果实际⽣产运⾏的话可以考虑将程序稍作修改,换成多进程+协程,或者异步。速度会快很多。
6.
说说数据:
⽇志数据:
好友关系数据:
个⼈信息数据:
数据库说明:
QQSpider主要爬取QQ⽤户的说说、⽇志、朋友关系、个⼈信息。
数据库分别设置 Mood、Blog、Friend、Information 四张表。
Mood 表:
_id:采⽤ “QQ_说说id” 的形式作为说说的唯⼀标识。
Co-oridinates:发说说时的定位坐标,调⽤地图API可直接查看具体⽅位,可识别到在哪⼀栋楼。
Comment:说说的评论数。
Like:说说的点赞数。
Mood_cont:说说内容。
PubTime:说说发表时间。
好qq号QQ:发此说说的QQ号。
Source:说说的根源(对于转发的说说),采⽤ “QQ_说说id” 的形式标识。
Tools:发说说的⼯具(⼿机类型或者平台)。
Transfer:说说的转发数。
URL:说说的链接地址。
isTransfered:此说说是否属于转发来的。
Blog 表:
_id:采⽤ “QQ_⽇志id” 的形式作为⽇志的唯⼀标识。
Blog_cont:⽇志内容。
Comment:⽇志的评论数。
Like:⽇志的点赞数。
PubTime:⽇志的发表时间。
QQ:发此⽇志的QQ号。
Share:⽇志的分享数。
Source:⽇志的根源(对于转发的⽇志),采⽤ “QQ_⽇志id” 的形式标识。
Title:⽇志的标题。
Transfer:⽇志的转发数。