同步操作将从 resolvewang/WeiboSpider 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
domain
不同用户的解析策略、不同domain
不同用户的主页分析策略等微博内容抓取相关
need_verify
字段设置为0,否则就设置为1,并且在云打码
官网注册一个云打码用户账号,并进行适当充值seed_ids
中home_url
和ajax_home_url
中的is_ori=1
为is_all=1
来
抓取用户的所有微博。目前指定用户是基于已有的seed_ids表中的home_crawled=0
的用户,你也可以自己指定想要抓取的用户。get_comment_list()
来抓取指定微博的所有评论,包括根评论和子评论。目前抓取的评论是从weibo_data
表中选取的comment_crawled=0
的微博,你可以指定微博mid来定制化爬取评论。反爬虫相关
其它
tasks
模块的作用和使用方法(请查看wiki中关1task queue
的说明)。 config/
sql/
spider.sql # 项目所用表
create_all.py # 可直接运行该文件生成项目所需要的数据表
__init__.py
conf.py # 获取配置文件的信息
spider.yaml # 配置文件信息,包括Mysql配置、Redis配置和一些抓取参数设定
db/
__init__.py
basic_db.py # 数据库元操作
keywords_wbdata.py # 关键词_微博数据关联表
login_info.py # 微博账号管理操作
models.py # sqlalchemy中用到的models
redis_db.py # redis相关操作
search_words.py # 搜索话题相关操作
seed_ids.py # 种子用户id管理操作
tables.py # 数据库对应的表
user.py # 微博用户相关操作
wb_data.py # 微博数据相关操作
weibo_comment.py # 微博评论相关操作
weibo_repost.py # 微博转发相关操作
decorators/
__init__.py
decorator.py # 项目中用到的装饰器,比如超时处理、解析异常处理
logger/
__init__.py
log.py # 日志操作
logs/ # 该目录用于存放日志文件
celery.log # celery相关log(最为详细)
weibo.log # 程序log
page_get/
__init__.py
basic.py # 基本的数据抓取操作
status.py # 微博详情页信息解析模块
user.py # 微博用户抓取
page_parse/
user/
__init__.py
enterprise.py # 解析服务号
person.py # 解析个人用户
public.py # 公共模版解析,比如左边部分和上边部分代码,可通用
basic.py # 微博返回内容解析,作用看是否为正常响应
comment.py # 评论解析
home.py # 用户主页微博数据解析
repost.py # 微博转发信息解析表
search.py # 微博搜索结果解析
status.py # 微博具体信息
tasks/
__init__.py
comment.py # 评论抓取任务
home.py # 用户主页微博抓取任务
login.py # 模拟登陆相关任务
repost.py # 转发信息抓取相关任务
search.py # 搜索相关任务
user.py # 用户抓取相关任务
workers.py # celery worker配置
tests/ # 一些解析模版,主要在开发解析模块的时候使用
utils/ # 工具类
__init__.py
code_verification.py# 验证码识别相关
util_cls.py # 工具类
wblogin/
__init__.py
login.py # 微博模拟登陆具体实现
env.sh # 创建虚拟环境
create_all.py # 创建数据库相关表的语句
headers.py # 请求头,主要是UA
test_wbspider.py # 没什么用的单元测试
requirements.txt # 项目相关依赖
login_first.py # 由于celery的定时器会有一定时间的间隔,所以**第一次需要手动登**,并且需要保证数据表`login_info`中已经插入了可用微博登陆账号
search_first.py # 如果想快速启动微博搜索任务,可以在定时任务运行之前运行该文件,前提是数据表`keywords`中已有数据
comment_first.py # 如果想快速启动评论抓取任务,可以在定时任务执行之前运行该文件,前提是数据表`weibo_data`中已有数据
home_first.py # 如果想快速启动用户主页微博抓取任务,可以在定时任务执行之前运行该文件,前提是数据表`wbuser`中已有数据
repost_first.py # 如果想快速启动微博转发抓取任务,可以在定时任务执行之前运行该文件,前提是数据表`weibo_data`中已有数据
LICENSE
.gitignore
.gitattributes
如果搭建项目环境比较困难,可以查看演示视频(链接: https://pan.baidu.com/s/1eSy2qzw 密码: ypn5)
环境配置:小白和新手请直接查看这里
项目相关配置
source env.sh
,直接创建项目需要的虚拟环境和安装相关依赖。注意目前env.sh
中支持的发行版是CPython
和Anaconda
,如果Python发行版
是其它,那么可能需要修改env.sh
文件中安装virtualenv
的命令.虚拟环境默认安装在项目根目录,文件夹是.env
。执行source env.sh
会默认安装所有项目需要的依赖。pip install -r requirements.txt
。这里celery版本用的3.1.25,目的是兼容windows用户。
如果你是linux或者mac用户,建议将celery版本升级成4.x。特别注意,Windows平台上Celery的定时功能不可用!所以如果需要用到定时任务分发的话,请务必将beat部署到linux或者mac上.python create_all.py
创建该项目需要的数据库表上面其实已经介绍完整个项目的配置流程了.如果大家对docker比较熟悉,也可以使用基于docker的方式进行部署。
如果大家有使用docker的经验,估计也不用我多说了吧,只是要注意一点,构建镜像的时候需要在项目的根目录,因为在构建
镜像的过程中会拷贝WeiboSpider
整个项目,目前用的硬编码,除了挂载可以灵活一点也没找到别的办法。镜像构建语句可以
是
docker build -f WeiboSpider/Dockerfile -t resolvewang/weibospider:v1.0 .
构建好镜像后运行容器默认是接受所有任务路由,如果只接收部分,直接覆盖CMD
的命令即可,比如我只想执行login任务,那么
docker run --name resolvewang/weibospider:v1.0 celery -A tasks.workers -Q login_queue worker -l info -c 1
又比如通过docker启动定时器
docker run --name spiderbeater resolvewang/weibospider:v1.0 celery beat -A tasks.workers -l info
入口文件:如果有同学有修改源码的需求,那么建议从入口文件开始阅读
基本用法:请按照启动worker=>运行login_first.py=> 启动定时任务或者别的任务这个顺序进行
celery -A tasks.workers -Q login_queue,user_crawler worker -l info -c 1 -Ofair
。如果不指定,
即运行celery -A tasks.workers worker -l info -c 1
,那么所有任务都可以在该节点实现。所有的queue及作用和更多关于worker的知识请
在wiki中查看python login_first.py
获取首次登陆的cookie,需要注意它只会分发任务到指定了login_queue
的节点上或者未指定 -Q
的节点上celery beat -A tasks.workers -l info
,因为beat任务会有一段时间的延迟(比如登录任务会延迟10个小时再执行),所以第二步要通过python login_first.py
来获取worker
首次运行需要的cookie.如果你想马上启动其他任务,而非等定时任务启动,那么可以执行相应的 *.first.py
,比如我想在worker启动和login_first.py执行后就执行用户抓取任务,那么就通过
python user_first.py
来执行flower -A tasks.workers
,通过'http://xxxx:5555' 访问所有节点信息,这里的xxxx
指的是节点的IP.
如果需要让外网访问,可以这样celery -A tasks.workers flower --address=0.0.0.0 --port=5555
mode
的值为quick
。关于极速和普通模式的区别,
请查看wiki
其它
问:项目部署好复杂啊,我也没有多台机器,我可以单机而不是单节点运行吗?
答:可以通过单机运行,单机运行的话,需要对代码做少许修改。主要修改方法是找到你需要的功能的
入口文件,然后跟着改,需要改的地方是@app.task
这些函数的代码。以登录为例,如果需要
单机登录的话,那么就先到login模块中把send_task()
这条语句
去掉,直接改成调用login_task()
函数即可。这里send_task()
是网络调用,修改
后就成了本地调用了
关于redis的问题:为什么我在给redis设置密码后,并且把redis设置成了守护进程,但是没起作用?
答:其实这个问题和项目关系不是特别大吧。。。不过考虑到有的同学并不熟悉redis,我这里还是阐明一下,
如果在linux上面搭redis的话,当我们修改了redis.conf
文件后,我们在启动redis的时候也需要指定redis.conf
文件,启动之前,最好把redis-server
加入到环境变量中。比如我的redis.conf
放在/etc/redis
中,
那么我可以通过先切换到/etc/redis
目录,再通过redis-server redis.conf
来启动redis server,也可以
直接redis-server /etc/redis/redis.conf
来启动,前提是 redis-server文件需要在环境变量中.另外,还得
注意一点,如果是centos的话,redis3.2.7可能会在make&&make install
阶段报错,建议下载redis3.2.8
这个项目的模拟登陆和抓取的时候是怎么处理验证码的啊?
答:这个项目并没有处理验证码在模拟登陆阶段会判断账号是否需要验证码,对于需要验证码的账号,通过打码平台识别验证码进行
操作,我选择的是云打码(另外一个微博爬虫项目作者推荐的,发现确实好用);对于微博账号抓取的时
候被封出现的验证码,目前的处理是从数据库和redis中删除该账号对应的信息,因为要复现登录后被封需要一些时间来测试,等项目功能方
面的代码实现得差不多了,可能会考虑这个问题,毕竟验证码的成本比账号低。
另外,我们应该尽量规避验证码,比如模拟登陆的时候尽量在账号常用地登录,还有一个点就是测试微博的容忍边界,小于它的阈值做采集 就不容易被封(不过速度很慢),毕竟按规矩来被封的风险要小得多。如果有图形图像识别的牛人解决了验证码的问题,欢迎提PR,帮助更多人。
这个项目能在windows上执行吗? 答:window上可以执行worker节点,beat节点是不可以的,因为windows不支持crontab。如果要混用windows和linux,那么一定 要将celery版本降级为3.1.25。虽然celery4和celery3都可以同时跑,但是这样做flower是没法同时监控两个版本的worker的。
这个项目一天能抓多少数据? 答:这个实在是没办法保证。数据量由你的账号和分布式节点数量决定的,最关键的是账号数量,目前我6个账号,4个节点,每天抓取量大概 2w条,如果需要更快,那么更多的账号是必不可少的。所以用户需要在速度和稳定性上做一些考量。
这个项目解析模块为什么用bs而不用xpath,会不会性能很差? 答:项目在一年半以前开始启动,那时候还没接触到xpath,所以选了bs。但是本项目的瓶颈并不在解析模块上,解析再快,还是会被IO请求 所拖累,因为微博服务端对相同cookie的一个时间段的访问次数有限制,并且bs的解析速度也不算慢了。
其它问题暂时还没发现,如果有朋友在使用中遇到问题,欢迎提issue或者直接加我微信询问,我看到的话都会回答的。
star
也是对本人工作的肯定和鼓励,
作者也接受捐赠:laughing:。送人玫瑰,手有余香:blush:。点击查看贡献者名单
如果本项目对你有用,欢迎对本项目进行捐赠,捐赠时候请留下你的github ID
,当然您也可以匿名捐赠。
star
支持的网友最后,祝大家玩得高兴,用得舒心!
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。