Python 3.6 抓取微博m站数据

Grand-Jon 2021-08-31 原文


Python 3.6 抓取微博m站数据


Python 3.6 抓取微博m站数据

2019.05.01 更新内容

  1. containerid 可以通过 "107603" + user_id 组装得到,无需请求个人信息获取;
  2. 优化多线程抓取,修复之前因urllib.request全局定义,导致代理无法正常切回本地IP;
  3. 优化分布式抓取策略,由每台机器顺序获取用户ID 再拼装URL抓取策略,修改为每台机器顺序获取URL进行抓取。防止由于某个微博账号微博动态过多导致负责本ID的机器长时间运行,而其他机器就要等待,浪费时间和资源。
  4. 加入IP代理池维护脚本,可以定时维护代理池中的有效代理IP,及时剔除无效IP。
  5. 加入Redis定时消费脚本,解决因抓取结果过大导致redis性能下降。
  6. 增加Redis连接池ConnectionPool ,解决因Redis链接端口数过多导致Redis拒绝服务错误。
  7. 调整Redis数据存储结构,采用list+set结合,存储UID+URL
  8. 单机https代理消费约100元/天,单机5个进程+代理每天能达到1000万条数据

本脚本截止20190501

类型 效果 代理花费
单机版(多线程+多进程) 150万/天 0
单机版(多线程+多进程)+IP代理池 1000万/天 100元/天
分布式(多线程+多进程)+IP代理池 千万~亿级 100*机器数量/天

抓取流程

  1. 启动save_uid.py脚本将准备好的微博用户ID,存入Redis中,保存两份;

    • r.lpush(WEIBO_UID_LIST_KEY, uid) 用于第一次遍历UID请求每个UID的总页数,然后生成每个UID的所有URL。
    • r.sadd(WEIBO_UID_SET_KEY, uid) 用于第二次请求,随机获取一个未抓取完的UID,去Redis中取当前UID剩余的URL进行抓取,全部抓取完毕则移除此UID。
  2. 启动proxy_pool.py脚本,初始化IP代理池(如果不使用代理,此步骤可略过)

    • target_money 用来获取你所购买的IP代理剩余金额的URL连接
    • target_ip 请求代理IP获取有效的代理IP
    • targetUrl 用来校验当前IP是否有效
    • WEIBO_PROXY_SET_KEY 存储有效的代理IP
    • WEIBO_PROXY_418_SET_KEY 存储已经出现418错误的IP,会循环利用,直到代理失效
    • WEIBO_ERROR_PROXY_SET_KEY 存储已经使用过的IP(失效IP),用于后期校验
  3. 启动start_crawler.py脚本,开启抓取任务

    • 首先会第一次请求遍历UID,生成所有的URL,然后所有的线程获取URL进行抓取
    • 先会尝试使用本地IP进行抓取,本地IP出现418之后,尝试去IP代理池获取可使用的IP,继续抓取
    • 使用代理IP抓取超过60s,停止代理抓取改为使用本地IP,循环进行
    • 代理IP出现418,则先去尝试使用本地IP,如果本地418再继续更换代理
    • 如果代理池没有可用IP,则休息30s,继续使用本地IP
  4. 添加Linux定时脚本,定时处理Redis队列中的抓取结果。

关于代理IP

  • 抓取微博的https连接,只能使用https代理,可选择市面上其他类型的代理商;
  • 免费的代理ip也有尝试,不过效果不是很好

部署问题

  • 需要一台主服务器(或者本机Windows电脑)来初始化运行 save_uid.pyproxy_pool.py脚本
  • 在Redis所在的服务器进行redis_consumer.py脚本的运行部署
  • start_crawler.py 可以集群部署到多台服务器,但要保证都能网络连通到Redis服务器
  • 添加定时脚本crontab -e 内容 如下
    0 */1 * * * nohup python /data/hw/redis_consume.py > /dev/null 2>&1 &
    
  • service cron restart 重启cron定时服务
  • 创建start.sh 开启多进程抓取
    #!/bin/bash
    # 开始爬虫程序;
    
    for((i=1;i<=5;i++));
    do
    nohup python /data/hw/start_crawler.py 1>/dev/null 2>&1 &
    echo "开启爬虫程序进程"+$i  
    done
    
    sleep 5s
    echo "已开启以下进程"
    ps -ef|grep python
    
    

20190501目录

  • proxy_pool.py #维护IP代理池
  • redis_consume.py #redis定时消费
  • save_uid.py #初始化uid
  • start.sh #一键启动脚本
  • start_crawler.py #开启抓取程序,可以集群部署

旧版本README

README_20190307.md

项目地址

https://github.com/JiaoHongwei/Crawler_weibo

发表于
2019-03-07 19:06 
Grand_Jon 
阅读(1381
评论(0
编辑 
收藏 
举报

 

版权声明:本文为Grand-Jon原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Grand-Jon/p/10491635.html

Python 3.6 抓取微博m站数据的更多相关文章

  1. Django的学习进阶(三)————ORM

    django框架是将数据库信息进行了封装,采取了 类——>数据表 对象——>记录 属性——> […]...

  2. Numpy数组对象的操作-索引机制、切片和迭代方法

    前几篇博文我写了数组创建和数据运算,现在我们就来看一下数组对象的操作方法。使用索引和切片的方法选择元素,还有如 […]...

  3. Python 爬取 热词并进行分类数据分析-[云图制作+数据导入]

    日期:2020.01.28 博客期:136 星期二      【本博客的代码如若要使用,请在下方评论区留言,之 […]...

  4. python 序列化pickle 和 encode的区别

    我们把变量从内存中变成可存储或传输的过程称之为序列化。   序列化之后,就可以把序列化后的内容写入磁盘,或者通 […]...

  5. python 控制台颜色

    python 控制台颜色 在python开发的过程中,经常会遇到需要打印各种信息。海量的信息堆砌在控制台中,就 […]...

  6. 对数损失函数(Logarithmic Loss Function)的原理和 Python 实现

    原理   对数损失, 即对数似然损失(Log-likelihood Loss), 也称逻辑斯谛回归损失(Log […]...

  7. Python模块 – paramiko

    paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包 […]...

  8. Python PTA期末

    6-1 接收n个数字,求这些参数之和 (3 分) 接收n个数字,求这些参数数字的和。 def sum_func […]...

随机推荐

  1. jmeter实现登录并设置token为全局变量

    很久不用jmeter了,发现以前的基础用法都遗忘了,所以重新记录一下吧。 我们平时使用软件都是需要先登录才可以 […]...

  2. 软件构造-经验-重绘,GUI与多线程的一次debug

    软件构造-经验-重绘,GUI与多线程的一次debug 记一次debug 在哈工大软件构造的lab6中,要求我们 […]...

  3. nodejs读取文件

    读取普通文件:https://blog.csdn.net/bnzjxbsjjdnnxj/article/details/123831042 https://wenku.baidu.com/...

  4. Offer快到碗里来,Volatile问题终结者

    微信公众号:大黄奔跑关注我,可了解更多有趣的面试相关问题。 写在之前面试问题概览面试回顾大黄可见性Demo演示 […]...

  5. 笔记本intel的T系列和P系列的区别

    p系列是刚出的迅驰2的处理器,(P8600,P8400)不过T系列也有迅驰2平台的。(T9600,T9400) […]...

  6. Android保存的文件显示到文件管理的最近文件和下载列表中

    发现Android开发每搞一个和系统扯上关系的功能都要磨死人,对新手真不友好。运气不好难以快速精准的找到有效的 […]...

  7. sersync+rsync文件自动同步

    上一篇写的 rsync 是通过手动执行命令的方式从服务端拉取文件同步 本片介绍:通过sersync监控目录中变 […]...

  8. 基于Java语言的IO操作(文件复制)

    public static void main(String[] args) {//获取复制开始前系统时间毫秒 […]...

展开目录

目录导航