首页 编程 软件学院 查看内容

Python分布式微博爬虫(源码分享)

2017-7-7 11:27 |来自: 互联网 2737 0

摘要: 项目地址:https://github.com/ResolveWang/weibospider关于本项目实现内容包括用户信息、用户主页所有微博、微博搜索、微博评论和微博转发关系抓取等本项目基于本人实际的工作,并对此做了大量的修改和改进。希望能 ...

项目地址:https://github.com/ResolveWang/weibospider


关于本项目

  • 实现内容包括用户信息、用户主页所有微博、微博搜索、微博评论和微博转发关系抓取等

  • 本项目基于本人实际的工作,并对此做了大量的修改和改进。希望能帮到对微博数据采集有需求的同学,对爬虫进阶 感兴趣的同学也可以看看。该项目从模拟登陆到各个页面的请求、从简单页面到复杂页面解析处理和相关的异常处理、 从单机到分布式迁移都做了大量的工作和反复测试,花了我绝大部分业余的时间

你可以用它来干嘛

  • 微博舆情分析

  • 论文撰写的一些数据,本项目会将抓到的所有数据不定时公布(资源和精力有限,暂时只有19.1w条微博用户数据)

  • 自然语言处理的语料,比如热门微博的所有评论

  • 爬虫进阶学习,对于需要学习Python进阶和爬虫的同学来说,都可以读读源码

为何选择本项目

  • 功能全面:包括了用户信息抓取、指定关键字搜索结果增量抓取、指定用户主页所有微博抓取、评论抓取和转发关系抓取等

  • 数据全面:PC端展现的数据量比移动端更加丰富。并且相比于其它同类项目对微博的简单分析,本项目做了大量细致的工作, 比如不同

    domain

    不同用户的解析策略、不同

    domain

    不同用户的主页分析策略等
  • 稳定!项目可以长期稳定运行。

  • 为了保证程序能长期稳定运行,数据所有的网络请求都是通过抓包手动分析的,未用任何自动化工具, 包括模拟登陆!从另一个方面来说,抓取速度也是比较有保证的(主要还是看账号数量)

  • 通过合理的阈值设定,账号可以保证安全

  • 即使账号不可用或者登陆失败,项目都对其做了处理(智能冻结账号,出错重试等),以保证每次请求都是有效的,并及时把错误反馈给用户

  • 通过大量的异常检测和处理,几乎捕获了所有的解析和抓取异常。编写了大量的解析代码来获取足够全面的信息

  • 复用性和二次开发性很好。项目很多地方都有详细的代码注释,方便阅读。即使本项目不能完全满足你 对微博数据采集和分析的需求,你也可以自己在该项目的基础上做二次开发,项目已经在微博抓取和各个 模版解析上做了大量工作。

  • 由于本项目与本人实际工作有关联(代码并不是工作中使用的代码),所以可以放心它会长期更新。目前已经迭代一年有余了。

  • 丰富文档支持:请点击wiki查看所有文档。如果文档仍然不能解决你的问题,推荐提issue,我们开发者看到后都会积极回答,也可以 通过加QQ群进行交流。注意在群里没事就潜水,有问题就问,开发者会积极回答。

项目结构

  • 功能模块

  • 微博模拟登陆任务 login.py

  • 微博用户抓取任务 user.py

  • 微博特定话题搜索任务 search.py

  • 微博用户主页信息抓取任务 home.py

  • 微博评论抓取任务 comment.py

  • 微博转发抓取任务 repost.py

配置和使用

  • 环境配置:小白和新手请直接查看这里

  • 考虑到Python3是趋势和一些将该项目用于学习的用户,项目运行环境为Python3.x

  • 项目存储后端使用Mysql,所以需要在存储服务器上安装Mysql,注意设置字符集编码为utf-8

  • 由于项目是使用celery做分布式任务调度,所以 需要使用broker和各个分布式节点通信,项目使用的是Redis,所以需要先安装Redis。 注意修改Redis的配置文件让它能监听除本机外的别的节点的请求,建议给Redis设置密码,如 果没设置密码,需要关闭保护模式(不推荐,这个有安全风险)才能和各个节点通信。如果害怕遇到Redis单点 故障,可以使用Redis主从配置。

入口文件:如果有同学有修改源码的需求,那么建议从入口文件开始阅读

  • login.py和login_first.py:PC端微博登陆程序

  • user.py和user_first.py:微博用户抓取程序

  • search.py和search_first.py:微博话题搜索程序

  • home.py和home_first.py:微博用户主页所有微博抓取程序

  • comment.py和comment_first.py:微博评论抓取

  • repost.py和repost_first.py:转发信息抓取

基本用法:请按照启动worker=>运行login_first.py=> 启动定时任务或者别的任务这个顺序进行

# coding:utf-8

from tasks.workers import app

from page_get import user as user_get

from db.seed_ids import get_seed_ids, get_seed_by_id, insert_seeds, set_seed_other_crawled

@app.task(ignore_result=True)

def crawl_follower_fans(uid):

seed = get_seed_by_id(uid)

if seed.other_crawled == 0:

rs = user_get.get_fans_or_followers_ids(uid, 1)

rs.extend(user_get.get_fans_or_followers_ids(uid, 2))

datas = set(rs)

# 重复数据跳过插入

if datas:

insert_seeds(datas)

set_seed_other_crawled(uid)

@app.task(ignore_result=True)

def crawl_person_infos(uid):

"""

根据用户id来爬取用户相关资料和用户的关注数和粉丝数(由于微博服务端限制,默认爬取前五页,企业号的关注和粉丝也不能查看)

:param uid: 用户id

:return:

"""

if not uid:

return

# 由于与别的任务共享数据表,所以需要先判断数据库是否有该用户信息,再进行抓取

user = user_get.get_profile(uid)

# 不抓取企业号

if user.verify_type == 2:

set_seed_other_crawled(uid)

return

app.send_task('tasks.user.crawl_follower_fans', args=(uid,), queue='fans_followers',

routing_key='for_fans_followers')

@app.task(ignore_result=True)

def excute_user_task():

seeds = get_seed_ids()

if seeds:

for seed in seeds:

app.send_task('tasks.user.crawl_person_infos', args=(seed.uid,), queue='user_crawler',

routing_key='for_user_info')

项目地址:https://github.com/ResolveWang/weibospider

使用任务路由的最大好处是你可以为不同的节点分配不同的任务,这样让整个系统的数据采集效率更高。比如用户抓取,一个http请求只能得到一个用户信息,而对于用户关注和粉丝抓取,一个http请求可以得到几十个关注或者粉丝用户的uid,所以可以部署一个用户关注或者粉丝抓取节点,部署10个或者更多的用户信息抓取节点,让任务能比较均衡地执行。

本文出处: http://www.toutiao.com/a6439596968398520577/
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部