# renren
**Repository Path**: onmyway1981/renren
## Basic Information
- **Project Name**: renren
- **Description**: 人人网信息抓取与数据挖掘。social network analysis
- **Primary Language**: Python
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-12-01
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
人人网信息抓取与数据挖掘
========================
人人网安全措施加强了,无法抓取原本没有权限访问的内容了。
不过,通过浏览器可以访问的内容,依旧可以抓取。
环境要求
--------
* ubuntu/win7/xp 皆可。
* python3.2 --> python2.7
* igraph/pycairo: 作图依赖该组件。
ubuntu 下使用 `apt-get install python3-igraph` 即可。
win32 版本下载并安装 [igraph](https://pypi.python.org/pypi/python-igraph/0.6.5) [pycairo](http://www.lfd.uci.edu/~gohlke/pythonlibs/#pycairo)
* mysql: 仅当使用mysql作为存储介质依赖该组件。
简单用法
--------
#### 人人网账号/密码配置
`config/spider.ini` 中根据提示配置即可。
#### 抓取人人网信息
# 抓取好友的好友列表,用于显示个人的好友关系图。
$ python3 get_info.py getNet2
# 正常的运行结果显示如下:
spider login success. rid=498934189
15:14:09 get net1 of 498934189
15:14:09 get net2 of 498934189,toSearch/total:40/40
#### 图像显示好友网络结构图
$ python3 net_graph.py
结果显示如下:
注:此处因为 igraph 插件的字符编码问题,好友姓名未能正常显示。
![relationship network graph][netgraph]
[netgraph]:test_net_graph.png
功能列表
--------
#### 人人网爬虫
1. 自动登录人人网并抓取 friendList, status, profile 等信息。
2. 支持长时间(40h+)持续运行,支持断点续抓。
4. 页面超时,自动重发 3 次请求。
3. 支持 run/debug 日志。run 日志记录抓取成功/失败信息,debug 日志用于调测。
5. 可灵活扩展多种本地存储方式,现已支持: myql, file
#### 好友关系图
绘制特定用户的好友关系图,方便分析人际关系网络。
暂时可获取以下关键信息:好友圈子结构、关键好友、男/女朋友。
#### 话题分析:
对状态进行自然语言分词和关键词分析,统计关心的话题。
#### 联系频率
分析状态中的~@/转发/回复~信息,统计联系频率分布规律。
一些结果
--------
#### 状态数与关键词数量关系图
近似直线,貌似意义不大。
![relationship between number of status and number of keywords][demoTopic]
[demoTopic]:topic/nstatus_nkeyword.png
design
======
人人网信息抓取与本地存储,数据源:[www.renren.com](www.renren.com)
`renren_spider` 直接依赖于 `browser` 和 `repo`。
现已支持`repo`:mysql, file。
新增`repo`只需根据 interface-repo 接口规范实现相关接口,
创建`spider`实例前调用`set_repo(module_name:str)`即可。
* browser:抓取页面并返回 record 和 运行信息(timecost or error info)。
* repo: 本地保存 record 和 download history,提供读写接口。
INTERFACE
---------
最新接口,参考单元测试用例。
架构改动以前,不更新此处的接口说明。
#### browse
* `pageStyle(renrenId) --> (record:dict,timecost:str)` 下载 pageStyle 页面的信息字段。
* `login(user,passwd) --> (renrenId,info)` 社交网站登录
#### repo
* `save_pageStyle(record, rid, run_info) --> nItemSave` 保存 record 和 history
pageStyle list: friendList, status
* `getSearched(pageStyle) --> rids:set`
* `getFriendList(rid) --> friendsId:set`
#### spider
* `login() --> same as browser.login()` login [www.renren.com](www.renren.com)
* `getStatus_friend(rid) --> None` get status of rid's friends
* `getNet2(rid) --> None` get friendList of rid's friends
design of modules
-----------------
### browser:
1. `_download`
简单的根据 url 获取 `html_content` 并返回给上层调用,便于性能统计。
2. `_iter_page`
页面类型分为:迭代的多页面,如 friendList, status; 单页面,如 profile,homepage。
实际抓取以迭代页面为主,对方出于性能考虑,通常鉴权较少,安全策略低。
`_iter_page` 迭代调用`_download`获取`html_content`并识别出其中的 items。
3. parse
解析 `_iter_page` 得到的 items, 获得信息字段 record。返回 dict()。
迭代页面一般包含多个 item,每个 item 有自己的 id。以此作为 dict 的 key。
单页面一般包含多个字段,可以处理为 tag = value 格式。以此作为 dict 的 key 和 value。
**内部接口规范**
1. `_download(url:str) --> html_content:str`
2. `_iter_page(pageStyle,rid) --> (items:set,'success'/error_info:str)` info is success or error info
3. `parse.pageStyle(items:set) --> record:dict() `
_parse.pageStyle 每次只解析一个用户特定 pageStyle 的字段_
### repo-mysql:
环境依赖:
* mysql,
* pymysql: [installation package link](https://github.com/petehunt/PyMySQL)
配置:
2. 在 `db_renren.ini` 中配置数据库信息,通常只需修改 `host`,`user`,`passwd`
以 mysql 作为本地存储介质。
每一类 `pageStyle` 一个接口,若传递了 `run_info` 字段,则自动写 `history`
1. `save_pageStyle` 存储 record 和 history
3. `self.table` 内部属性,已经确认创建的表空间及表名。
4. `_init_table` 根据 pageStyle 创建表空间并初始化 `self.table`
5. `_getConn` 获取 mysql conn。数据库连接参数在 `db_renren.ini` 中配置。
2. `getSearched` 查询 history 表,获取已查询集合。
3. `get_friendList`
**内部接口规范**
1. `save_pageStyle(record:dict, rid:str) --> number_of_items_saved:int` call `_save_process` to save record and history
2. `_save_process(pageStyle:str, record:dict, rid:str, run_info:str) --> number_of_items_saved:int`
3. `_sql_pageStyle(record:dict,rid:str) --> sqls:list` called by `_save_process` to construct sqls
4. `_sql_create_table(pageStyle:str) --> sql` call by `_init_table`, read table info from config file and return sql for create table.
### parse
#### profile
**内部字段规范:**
1. gender:
- 'f': female
- 'm': male
- 'u': unknown
- None: error
2. birth:
- `birth_year`: 4 digits, 9999 if empty. None if error
- `birth_month`: 2 digits, 99 if empty. None if error
- `birth_day`: 2 digits, 99 if empty. None if error
3. hometown:
- string.
- '': empty
- None: error
4. edu: now/college/senior/junior/primary
- school_name:string: if only one school name contains, such as edu_now in pf_mini
- list with dict element, dict value is '' if empty
- name: '' if empty
- year: entrance year
- major
- []: empty
- None:error
请求 profile 页面,可能返回 2 种页面,分别包含以下字段。
1. profile detail.
- basic: birthday, hometown, gender
- edu: college, senior, junior, primary, technology
- work: company, period
- contact: empty and no use. qq, msn,phone, domains, personal website
2. profile brief.
- basic: gender, birthday, hometown
- present: location/address, work, school
字段有效性分析:
1. school
人人网自身实现不严格,导致大学、高中信息交叉重叠。
处理方式:初始化全国高校列表,以消除中学与高校的混淆。
2. 生日/星座
资料解析+状态/分享分析
3. 年龄
资料解析+高中好友平均年龄估计区间
4. 性别
资料解析,通常可信度较高。
4. 家乡
资料解析+中学好友分布分析
5. 现居信息--不处理
可信度较低,少有人维护。
6. 工作信息--不处理
数据规模太少。
### spider
各种功能方法中生成待抓取的 `rid` 序列,由 `seq_process` 抓取。
**内部接口规范**
1. `seq_process(toSearch:str/set,pageStyle:str)` download and save record