QQ空间(日志、说说、个人信息)python爬虫源码(一天可抓取 400 万条数据)

爬虫功能:

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. 我们登陆QQ要使用到phantomJS(下载地址:http://phantomjs.org/download.html),下载完将里面的 phantomjs.exe 解压到python目录下即可。

启动程序:

  1. 进入 myQQ.txt 写入QQ账号和密码(不同QQ换行输入,账号密码空格隔开)。如果你只是测试一下,则放三两个QQ足矣;但如果你开多线程大规模抓取的话就要用多一点QQ号(thread_num_QQ的2~10倍),账号少容易被检测为异常行为。
  2. 进入 init_messages.py 进行爬虫参数的配置,例如线程数量的多少、设置爬哪个时间段的日志,哪个时间段的说说,爬多少个说说备份一次等等。
  3. 运行 launch.py 启动爬虫。

4.爬虫开始之后首先根据 myQQ.txt 里面的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. 最后提醒一下,爬虫无非就是模仿人在浏览器上网的行为,你在浏览器上无法查看的信息爬虫一般也是无法抓取。所以,就不要再问我能不能破解别人相册的这种问题了,空间加了访问权限的也无法访问。程序输出的日志中2016-11-19 01:05:33.010000 failure:484237103 (None - http://user.qzone.qq.com/484237103)这种,一般就是无法访问的QQ。还有,我们是无法查看一个QQ的所有好友的,所以爬下来的好友信息也只是部分好友。爬虫不是黑客,希望理解。

说说数据:

日志数据:

好友关系数据:

个人信息数据:

数据库说明:

QQSpider主要爬取QQ用户的说说、日志、朋友关系、个人信息。 数据库分别设置 Mood、Blog、Friend、Information 四张表。

Mood 表: _id:采用 “QQ_说说id” 的形式作为说说的唯一标识。 Co-oridinates:发说说时的定位坐标,调用地图API可直接查看具体方位,可识别到在哪一栋楼。 Comment:说说的评论数。 Like:说说的点赞数。 Mood_cont:说说内容。 PubTime:说说发表时间。 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:日志的转发数。 URL:日志的链接地址。 isTransfered:此日志是否属于转发来的。

Friend 表: _id:采用 QQ 作为唯一标识。 Num:此QQ的好友数(仅统计已抓取到的)。 Fx:朋友的QQ号,x代表第几位好友,x从1开始逐渐迭加。

Information 表: _id:采用 QQ 作为唯一标识。 Age:年龄。 Birthday:出生日期。 Blog:已发表的日志数。 Blogs_WeGet:我们已抓取的日志数。 Blood_type:血型。 Career:职业。 Company:公司。 Company_address:公司详细地址。 Company_city:公司所在城市。 Company_country:公司所在国家。 Company_province:公司所在省份。 Constellation:星座。 CurrentTime:抓取当前信息的时间(不同时间信息会不同)。 FriendsNum:好友数(仅统计已抓取的)。 Gender:性别。 Hometown_city:故乡所在城市。 Hometown_country:故乡所在国家。 Hometown_province:故乡所在省份。 Living_city:居住的城市。 Living_country:居住的国家。 Living_province:居住的省份。 Marriage:婚姻状况。 Message:空间留言数。 Mood:已发表的说说数。 Mood_WeGet:我们已抓取的说说数。 PageView:空间总访问量。 Picture:已发表的照片数(包括相册里的照片和说说里的照片)。

结语:

  • 爬虫是偏后台型的任务,以抓取效率为主,并没有很好的用户界面,并且需要不断地维护。所以对于完全没有编程基础的人来说,可能会遇到各种各样的问题。此项目最初的目的是为大家提供QQ空间爬虫的一种架构,并不保证程序一直能跑。只要腾讯服务器端稍有变动,例如某一个链接变了,可能程序就抓不到数据了,此时程序也要相应地将链接换成新的,如果网页结构变了,解析规则也要相应地修改。

本文代码github地址:点击阅读原文获取。

END.

原文:http://blog.csdn.net/bone_ace/article/details/53213779

原文发布于微信公众号 - PPV课数据科学社区(ppvke123)

原文发表时间:2017-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

使用各种扫描工具的你,不但踩了“蜜罐”可能还要被团灭了

*本文原创作者:evil7,本文属FreeBuf原创奖励计划,未经许可禁止转载 ? 工作后,越来越没有时间挖洞和写东西了(被世俗的纷争与微弱的工资束缚着),真是...

2948
来自专栏菩提树下的杨过

Flash/Flex学习笔记(7):FMS3.5基于IIS的安装

一般来讲,在windows上安装软件从来都不是什么难事儿,但FMS却在安装过程中"充满"了误导(好吧,其实也就是夸张的说法而已) 1.下载FMS3.5 http...

2366
来自专栏web前端教室

[前端常见病] 之 后端数据还没有,前端怎么进行?

标题所描述的情况,一般出现在后端进度滞后,前端又积累了一些工作量的情况下。在业务需求已经基本清晰的时候,前端的进度是很快的,UI设计出设计图,前端小兄弟切页面,...

23610
来自专栏iOS技术

设计一个简单的 iOS 架构前言一、关于组件化二、模块化思维划分文件三、减少全局宏的使用四、去基类化设计五、MVC?MVP?MVVM?VIPER?结语

正如“100个读者就有100个哈姆雷特”一样,对于架构的理解不同的软件工程师有不同的看法。架构设计往往是一个权衡的过程,每一个架构设计者都要考虑到各个因素,比如...

1643
来自专栏解Bug之路

解Bug之路-TCP粘包Bug

详情见笔者另一篇博客https://my.oschina.net/alchemystar/blog/833937

1172
来自专栏大数据挖掘DT机器学习

QQ空间(日志、说说、个人信息)python爬虫源码(一天可抓取 400 万条数据)

爬虫功能: QQSpider 使用广度优先策略爬取QQ空间中的个人信息、日志、说说、好友四个方面的信息。 判重使用“内存位”判重,理论上亿数量级的QQ可瞬间判...

5994
来自专栏Java技术栈

同样是5年的开发经验,差距在哪里了?

我现在就职于一家中型的互联网企业,去年年底入职的薪资和待遇都很不错,但是总结起来说的好听就是全村人的希望,说的不好听就是一个人几乎干了一个项目组的事。

1096
来自专栏逸鹏说道

一个粗心的Bug,JSON格式不规范导致AJAX错误

一、事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里。 当时正在联调一个项目,由于后端没有提供数据...

3614
来自专栏知晓程序

我,一个自诩牛逼上天的 Node.js 和小程序开发者,今天就教「快应用」好好做人

1502
来自专栏数据之美

linux 系统监控、诊断工具之 IO wait

1、问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端、本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台...

42910

扫码关注云+社区

领取腾讯云代金券